29. august 2006 - 14:37Der er
33 kommentarer og 1 løsning
Hjælp til SQL query
Hej eksperter.
Jeg er sammen med brugeren datasource ved at lave noget søge noget. Men i min SELECT sætning skal jeg vælge flere databaser ?
Her er den jeg bruger, men den virker bare ikke ?: ---------- (select * from nummre where nummer like \"%$trimmed%\") union (select * from nummerserie where nummer0 like \"%$trimmed%\") order by id ----------
mysql_query( "(select * from nummre where nummer like \"%$trimmed%\") union (select * from nummerserie where nummer0 like \"%$trimmed%\") order by id" ) or die(mysql_error());
Så du kan se om der sker mysql fejl eller sådan noget :)
nej der er sådan set ikke nogen sammenhæng mellem tabellerne..altså det jeg skal er at jeg vil kunne søge på nummer i nummre og på nummer0-9 i nummerserie.
Der skal være en sådan sammenhæng ... ellers er UNION ikke den rigtige at bruge. UNION lægger populært resultaterne af to SQL-forespørgelser sammen. For at dette kan lade sig gære skal de være "ens" (hvilket bl.a. betyder at der skal være det samme antal kollonner i begge):
1)
Hvis du nu har en tabel:
=== demoTabel === id navn alder
- så vil:
(SELECT * FRON demoTabel WHERE alder=42) UNION (SELECT * FRON demoTabel WHERE alder=100)
- give netop de personer hvor alderen enten er 42 eller 100.
UNION virker i dette tilfælde fordi at:
SELECT * FRON demoTabel ...
- altid giver noget ud på formen:
id, navn, alder
2)
Hvis man derfor bruger UNION på to forskellige tabeller, så skal de "ligne hinanden":
=== demoTabelElever === id navn alder
=== demoTabelLærere === id navn alder
For så giver hver SELECT "det samme":
(SELECT * FRON demoTabelElever WHERE alder=15) UNION (SELECT * FRON demoTabelLærere WHERE alder=50)
Denne giver de elever (fra tabellen demoTabelElever) som er 15, og de lærer (fra demoTabelLærere) som er 50.
3)
Men hvis de to tabeller ikke er "fuldstændig ens":
=== demoTabelElever === id fornavn alder
=== demoTabelLærere === id navnet alderen
- så skal der dels være en slags sammenhæng mellem de to tabeller: id=id, fornavn=navnet og alder=alderen
Hvis der er det, kan man bruge AS til at få dem til at ligne:
(SELECT id, fornavn AS navn, alder FRON demoTabelElever WHERE alder=15) UNION (SELECT id, navnet AS navn, alderen AS alder FRON demoTabelLærere WHERE alder=50)
... og hvis der f.eks. er et forskelligt antal kolonner i de to tabeller, så skal man beslutte sig til hvilke der skal med:
=== demoTabelElever === id fornavn mellemnavn eftrenavn alder
=== demoTabelLærere === id navnet alderen
Eksempel:
(SELECT id, fornavn AS navn, alder FRON demoTabelElever WHERE alder=15) UNION (SELECT id, navnet AS navn, alderen AS alder FRON demoTabelLærere WHERE alder=50)
Her må man altså undvære mellemnavn og efternavn fra demoTabelElever-tabellen for at det passer sammen.
Jeg mener faktisk godt du kan have forskellige navne på felterne, men datatypen skal matche - Det er den første tabel i UNION'en hvis feltnavne bliver brugt... Har ikke lige energien, men det står nok her: http://dev.mysql.com/doc/refman/4.1/en/union.html
okay. Ja jeg fik fat i det men er elendig til sådan nogle sætninger..så det vil sige at jeg kun kan søge på én af de der nummer0-9 - felter fordi der også kun er ét felt i nummre som jeg søger på ?
Du har ret, det står nu ikke så langt nede. Paragraf nr. 2:
"The column names from the first SELECT statement are used as the column names for the results returned. Selected columns listed in corresponding positions of each SELECT statement should have the same data type. (For example, the first column selected by the first statement should have the same type as the first column selected by the other statements.) "
(SELECT nummer FROM nummre WHERE nummer LIKE \"%$trimmed%\") UNION (SELECT nummer0 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT nummer1 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT nummer2 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT nummer3 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT nummer4 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT nummer5 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT nummer6 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT nummer7 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT nummer8 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT nummer9 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") ORDER BY id
Så skal "id" nok være iblandt det felter som SELECT'es:
(SELECT id, nummer FROM nummre WHERE nummer LIKE \"%$trimmed%\") UNION (SELECT id, nummer0 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT id, nummer1 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT id, nummer2 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT id, nummer3 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT id, nummer4 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT id, nummer5 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT id, nummer6 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT id, nummer7 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT id, nummer8 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") UNION (SELECT id, nummer9 AS nummer FROM nummerserie WHERE nummer0 LIKE \"%$trimmed%\") ORDER BY id
(SELECT id, nummer FROM nummre WHERE nummer = $trimmed) UNION (SELECT id, nummer0 AS nummer FROM nummerserie WHERE nummer0 = $trimmed) UNION (SELECT id, nummer1 AS nummer FROM nummerserie WHERE nummer0 = $trimmed) UNION (SELECT id, nummer2 AS nummer FROM nummerserie WHERE nummer0 = $trimmed) UNION (SELECT id, nummer3 AS nummer FROM nummerserie WHERE nummer0 = $trimmed) UNION (SELECT id, nummer4 AS nummer FROM nummerserie WHERE nummer0 = $trimmed) UNION (SELECT id, nummer5 AS nummer FROM nummerserie WHERE nummer0 = $trimmed) UNION (SELECT id, nummer6 AS nummer FROM nummerserie WHERE nummer0 = $trimmed) UNION (SELECT id, nummer7 AS nummer FROM nummerserie WHERE nummer0 = $trimmed) UNION (SELECT id, nummer8 AS nummer FROM nummerserie WHERE nummer0 = $trimmed) UNION (SELECT id, nummer9 AS nummer FROM nummerserie WHERE nummer0 = $trimmed) ORDER BY id
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.