SQL query
Ik wil nu echter weer iets waarvan ik zelf problemen zie. Misschien iemand een iedee. Het is niet de bedoeling de database structuur aan te passen, dit blijft namelijk een phpbb forum.
Ik gebruik deze query om data zichtbaar te maken op mijn site. De functie zorgt voor de output.
$sql = 'SELECT * '
. ' FROM `phpbb_posts_text` '
. ' WHERE `post_subject` '
. ' LIKE "2006 01%"'
. ' ORDER BY `post_subject` DESC LIMIT 0, 30';
Display($sql);
Het veld post_subject bevat zoiets als dit:
2005 12 01 Muziek; Marillion; Garden party
Is het mogelijk om de manier van sorteren te beginnen op de 12e karakter van het veld? Dus dan selecteer ik vanaf muziek die dan op alfabet kom te staan ipv de datum. Iets in mij zegt dat dit niet echt makkelijk gaat. tenzij ik de data achteraf na het lezen ga selecteren.
Groet,
Rob
Gewijzigd op 13/01/2006 09:53:00 door Rob
Gewijzigd op 13/01/2006 09:45:00 door PHP erik
Mysql.com:
The following statements will return the second to sixth row from the tbl table:
mysql> SET @skip=1; SET @numrows=5;
mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";
mysql> EXECUTE STMT USING @skip, @numrows;
mysql> SET @skip=1; SET @numrows=5;
mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";
mysql> EXECUTE STMT USING @skip, @numrows;
Misschien kan je hier wat mee...
Ik heb net even getest en SUBSTR werkt hier niet. Het moet SUBSTRING zijn, dan doet hij het.
Mijn post is ook beetje onzin geloof ik... Zie nu pas dat dat in de console gebeurt. Zijn 3 querys voor nodig...
SELECT *
FROM `phpbb_posts_text`
WHERE `post_subject`
LIKE "%muziek%"
ORDER BY SUBSTRING( `post_subject` , 11 ) LIMIT 0 , 30
Mooi taaltje hoor :)
Kan ik dan ook deze eerste 11 karakters uit deze 'post_subject' weglaten uit het resultaat? Natuurlijk kan ik het weghalen achteraf, maar kan het ook verwijderd worden in de query. Het veld moet in database natuurlijk zelfde blijven, maar in het resultaat van de query mag het weg.
Rob
Backtics horen niet thuis in een query. Die worden alleen door MySQL geaccepteerd en heb je alleen nodig wanneer je gereserveerde woorden als tabel- of kolomnaam gaat gebruiken. Dat gaat vroeg of laat problemen opleveren. Niet doen dus.
Om je query sneller te maken, kun je i.p.v. een * beter noteren welke kolommen je allemaal nodig hebt. Het is maar zelden dat je alle gegevens nodig hebt.
Voorbeeld met lange notatie voor de overzichtelijkheid (heeft mijn voorkeur, voorkomt fouten):
SELECT
kolomnaam,
nogeenkolomnaam,
etc
FROM
phpbb_posts_text
WHERE
YEAR(post_subject) = 2006
AND
MONTH(post_subject) = 1
ORDER BY
SUBSTRING(post_subject,8)
DESC
LIMIT 0, 30
Ik begrijp precies wat he bedoeld, tenminste de strekking van je verhaal. Maar omdat ik een bestaande database structuur gebruik waren de velden al gedefineerd. Deze liggen vast en wil en kan ik niet veranderen, omdat het forum wat gebruik maakt van deze database dan niet meer werk. Het is dus een textveld. En de enige manier om daar datum in te zetten is dan jjjj mm dd. Op deze manier kan je toch sorteren.
Het * snap ik en zal dit ook zeker veranderen voor de naam van de kolomen die er nodig zijn. Het scheelt overigens maar 1 of 2 kolomen. Maar het is winst.
Wat versta je onder backticks? is dat het trimmen van dat veld waar ik om vroeg? Oke, dat los ik dan anders op.
Dus het is voor mij een keuze die ontstaan is, door de structuur die er bestaat. Op deze manier haal ik data uit een forum. Je moet dan roeien met de riemen die je hebt. Maar vind het onwjis tof dat je meedenkt... en leer er erg veel van!
Rob
Rob:
Wat versta je onder backticks? is dat het trimmen van dat veld waar ik om vroeg? Oke, dat los ik dan anders op.
Ik zie dat Frank offline is, dus ik ben even zo vrij ...
Backticks zijn deze dingen: `
(Vlak boven de tab-toets zit ie)
Het is een dialect van MySQL dat in andere databases niet gebruikt wordt, dus kun je ze beter niet aanleren.
Je ziet ze veel bij *uch* criminals en iedereen die 'dankzij' criminals heeft leren programmeren. Phpmyadmin heeft overigens ook de nare eigenschap om ze standaard in de queries te zetten.
Begrijpelijk dat je niet direct de hele boel gaat aanpassen, maar pas deze kennis dan toe bij zelfgemaakte scripts of uitbreidingen op bestaande scripts.
Veel succes.
Op die fiets.
De query wordt aangeroepen vanuit PHP. Wat ik heb gedaan is met PHPmyAdmin een query gemaakt en getest, zodat ik zeker weet dat hij door de provider goed verwerkt wordt. Hierna heb je de mogelijkheid om hier een PHP query van te maken. Zo kom ik aan die querys.
Begrijpt PHP het ook als ik deze backticks weglaat?
SELECT *
FROM `phpbb_posts_text`
WHERE `post_subject`
LIKE "%muziek%"
ORDER BY SUBSTRING( `post_subject` , 11 )
Kan ik dan ook deze eerste 11 karakters uit deze 'post_subject' weglaten uit het resultaat? Natuurlijk kan ik het weghalen achteraf, maar kan het ook verwijderd worden in de query. Het veld moet in database natuurlijk zelfde blijven, maar in het resultaat van de query mag het weg.
Rob
SELECT
veld1,
veld2,
SUBSTRING(post_subject, 11) AS korte_tekst
FROM phpbb_posts_text
WHERE post_subject LIKE "%muziek%"
ORDER BY SUBSTRING(post_subject, 11)
daarna kun je veld1, veld2 en korte_tekst ophalen met mysql_fetch_array bijvoorbeeld.
SELECT
veld1,
veld2,
SUBSTRING(post_subject, 11) AS korte_tekst
FROM
phpbb_posts_text
WHERE
post_subject LIKE "%muziek%"
ORDER BY
korte_tekst
Dat scheelt je weer een functie en is dus een fractie sneller.
Snaa de werking, maar in mijn geval kan ik hem niet gebruiken of ik moet mijn script totaal anders gaan maken.
Dit kan zeker niet?
SUBSTRING(post_subject, 11) AS post_subject
Wat ik er mee bedoel is, dat de waarde wel in dezelfde velden moet blijven. Maar geen nood, kan hem altijd zo trimmen met PHP.
kan wel, maar is niet slim. post_subject is in dit geval namelijk niet gelijk aan post_subject. En dat is wat vreemd...
post_subject != post_subject ???
Daarom altijd een alias gebruiken die een andere naam heeft dan het origineel.
Je kunt wel beide gegevens opvragen in je query:
SELECT
veld1,
veld2,
post_subject,
SUBSTRING(post_subject, 11) AS korte_tekst
FROM
phpbb_posts_text
WHERE
post_subject LIKE "%muziek%"
ORDER BY
korte_tekst
Je krijgt dan post_subject én de korte_tekst terug van je database.
Frank:
Volgens mij kun je dan ook direct sorteren op de alias
Ja, dat wist ik dus niet zeker. Aliassen kun je namelijk in WHERE vaak weer niet gebruiken toch?
Klopt, in de WHERE kan het niet, maar je kunt er wel op sorteren.
Groet,
Rob