Avatar billede iostream Nybegynder
29. august 2006 - 14:37 Der 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
----------

Den kommer med denne fejl:
http://lpwebdesign.dk/nummer/nyt_nummer.php?q=10
Avatar billede coderdk Praktikant
29. august 2006 - 14:39 #1
prøv at lave en

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 :)
Avatar billede iostream Nybegynder
29. august 2006 - 14:44 #2
sådan der står: "The used SELECT statements have a different number of columns"
Avatar billede coderdk Praktikant
29. august 2006 - 14:51 #3
A-ha! :)

UNION kræver at alle queries returnerer samme kolonner ;)
Avatar billede iostream Nybegynder
29. august 2006 - 14:52 #4
og det vil sige ?...at det ikke kan lade sig gøre ?
Avatar billede nielle Nybegynder
29. august 2006 - 14:54 #5
Ikke helt, man kan få kollonnerne til at ligne hinanden ved at bruge AS-alias.

Hvordan ser de to tabeller ud?
Avatar billede iostream Nybegynder
29. august 2006 - 14:58 #6
Den første tabel hedder nummre og ser sådan ud:

----------------------------------
| id | nummer | pris | guldnummer |
----------------------------------

anden tabel som hedder nummerserie sådan:

----------------------------------------------------------------------------
| id | fornummer | nummer0 | ... | nummer9 | nummer0guld | ... nummer9guld |
----------------------------------------------------------------------------
Avatar billede nielle Nybegynder
29. august 2006 - 15:01 #7
Hvordan svare felterne i de to tabeller til hinaden?

Er "nummer" i "nummre" f.eks. det samme som "fornummer" i "nummerserie" eller er det måske "nummer0"?

Eller er det slet ikke sådan de to tabeller passer sammen?
Avatar billede iostream Nybegynder
29. august 2006 - 15:02 #8
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.
Avatar billede iostream Nybegynder
29. august 2006 - 15:03 #9
er ikke helt sikker på hvad du mener med at felterne svarer til hinanden ?
er nemlig nybegynder så :p
Avatar billede nielle Nybegynder
29. august 2006 - 15:15 #10
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)
Avatar billede nielle Nybegynder
29. august 2006 - 15:18 #11
4)

... 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.
Avatar billede coderdk Praktikant
29. august 2006 - 15:18 #12
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
Avatar billede iostream Nybegynder
29. august 2006 - 15:22 #13
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å ?
Avatar billede nielle Nybegynder
29. august 2006 - 15:22 #14
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.) "
Avatar billede nielle Nybegynder
29. august 2006 - 15:24 #15
29/08-2006 15:22:21> Hvad er det for nogle af felter du skal have udtrukket af de to tabeller?
Avatar billede iostream Nybegynder
29. august 2006 - 15:24 #16
okay..men vil en af jer så ikke være så venlige at lave den sætning som søger på bare 2 af dem ? så er det vist tid til point
Avatar billede iostream Nybegynder
29. august 2006 - 15:25 #17
jeg skal have udtrukket - nummer i tabellen nummre
og - nummer0 til nummer9 i tabllen nummerserie
Avatar billede nielle Nybegynder
29. august 2006 - 15:29 #18
Sådan?

(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
Avatar billede iostream Nybegynder
29. august 2006 - 15:30 #19
der kommer denne fejl: Unknown column 'id' in 'order clause'
Avatar billede nielle Nybegynder
29. august 2006 - 15:31 #20
Hedder feltet ikke id i tabellerne nummre og nummerserie?
Avatar billede iostream Nybegynder
29. august 2006 - 15:32 #21
jo, det gør det
Avatar billede nielle Nybegynder
29. august 2006 - 15:33 #22
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
Avatar billede iostream Nybegynder
29. august 2006 - 15:39 #23
jamen det virker jo...så må i da gerne lægge et svar
Avatar billede nielle Nybegynder
29. august 2006 - 15:41 #24
Er du helt sikker på at det er di rigtige resultater du får ud? Skal det være:

... WHERE nummer0 LIKE \"%$trimmed%\"

- på de sidste 10 SELECTS? Eller skal det måske f.eks. være:

... WHERE nummer3 LIKE \"%$trimmed%\"

- på den 4. af dem?
Avatar billede nielle Nybegynder
29. august 2006 - 15:42 #25
Et andet spørgsmål. Er nummerX et talfelt eller et tekstfelt?
Avatar billede iostream Nybegynder
29. august 2006 - 15:42 #26
når ja..det prøver jeg lige
Avatar billede iostream Nybegynder
29. august 2006 - 15:46 #27
det er talfelter
Avatar billede nielle Nybegynder
29. august 2006 - 15:53 #28
Så er dette bår mere korrekt, og hurtigere:

(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
Avatar billede iostream Nybegynder
29. august 2006 - 16:09 #29
mange tak ;)
Avatar billede nielle Nybegynder
29. august 2006 - 16:13 #30
Svar :^)

coderdk skal vel også have noget for at have bidraget undervejs?
Avatar billede iostream Nybegynder
31. august 2006 - 22:01 #31
Ja du kan ligge et svar coderdk
Avatar billede coderdk Praktikant
31. august 2006 - 23:31 #32
Nej, tak, nielle har brugt tid nok på det til jeg synes han skal have det hele :)
Avatar billede nielle Nybegynder
11. september 2006 - 20:32 #33
Så mangler du bare at acceptere svaret :^)
Avatar billede nielle Nybegynder
24. september 2006 - 20:59 #34
Takker for point :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester