Avatar billede naesbygaard Nybegynder
11. juni 2003 - 19:44 Der er 14 kommentarer og
1 løsning

Join måske? Eller bare alm. select!

Jeg har følgende tabeller:

table1:
- id
- navn

table2:
- id
- nummer
- status

table3:
- table2id (referenceid til tabel2)
- table1id (referenceid til tabel1)

jeg vil gerne udtrække:
alle de numre fra table2 hvis id er repræsenteret i table3 (table2id) OG har status = '1'
af dem skal det kun være de table3.table1id som er = '5'
skal grouperes efter nummer.

Det smager lidt af: select table2.nummer FROM table2, table1 WHERE table2.id = table3.table2id AND table2.status = '1' AND table3.table1id = '5' GROUP BY table2.nummer

men dette giver ikke det rigtige resultat. Jeg har også prøvet med en left join men også uden held.
Jeg er tvivl om rækkefølgen af ANDs og om der skal være parenteser om osv. osv. Jeg kunne godt bruge en uddybende forklarring til svaret :)

/NbG
Avatar billede detox Nybegynder
11. juni 2003 - 19:53 #1
Måske skal du have: "FROM table3, table2, table1" med?
Avatar billede naesbygaard Nybegynder
11. juni 2003 - 20:00 #2
det ændrer ikke noget
Avatar billede arne_v Ekspert
11. juni 2003 - 20:12 #3
Rækkefølgen af AND er ligegyldig og parenteser er ikke nødvendige.

Du mener:

select table2.nummer FROM table2, table3 WHERE table2.id = table3.table2id AND table2.status = '1' AND table3.table1id = '5' GROUP BY table2.nummer

ikke (tabel3 i.s.f. table1) ?

Får du for mange eller for få data ?

Og er du sikker på at status og id er text felter og ikke heltal felter ?

(hvis der er heltal skal der ikke bruges '' omkring konstanterne)
Avatar billede naesbygaard Nybegynder
11. juni 2003 - 21:05 #4
Jeg får for mange!
status er enum ('0', '1') og id er heltal.
OBS: table3.table1id = '5' <- denne sætning bliver til:
table3.table1id = 5 OR table3.table1id = 6 OR table3.table1id = 7
skal der så parentes rundt om den?
Avatar billede arne_v Ekspert
11. juni 2003 - 21:10 #5
Ja !

Sæt en parentest omkring dine OR's.
Avatar billede naesbygaard Nybegynder
11. juni 2003 - 21:15 #6
SELECT t2.* FROM t2, t3 WHERE t2.status = 1 AND t3.tabel2id = t2.id AND (t3.tabel1id = 5 or t3.tabel1id = 6 or t3.tabel1id = 7) GROUP BY t2.nummer

Men dette virker ikke!
Avatar billede arne_v Ekspert
11. juni 2003 - 21:19 #7
GROUP BY kræver en aggregerende funktion.

Altså enten:

SELECT t2.* FROM t2, t3 WHERE t2.status = 1 AND t3.tabel2id = t2.id AND (t3.tabel1id = 5 or t3.tabel1id = 6 or t3.tabel1id = 7) ORDER BY t2.nummer

eller:

SELECT t2.nummer,COUNT(*) FROM t2, t3 WHERE t2.status = 1 AND t3.tabel2id = t2.id AND (t3.tabel1id = 5 or t3.tabel1id = 6 or t3.tabel1id = 7) GROUP BY t2.nummer
Avatar billede naesbygaard Nybegynder
11. juni 2003 - 21:37 #8
nu har jeg vidst fat i noget, det er det der enumfelt der er underligt. Det opfører sig helt omvendt! Faktum er at jeg har to statusfelter, og hvis jeg vælger status 1 så får jeg alle dem som har status 0. Men hvis jeg vælger status 0 så får jeg intet. Skal jeg bare lave felttypen om til int? (jeg tester alligevel på det indsatte)
Avatar billede arne_v Ekspert
11. juni 2003 - 21:40 #9
Du kan jo prøve.
Avatar billede naesbygaard Nybegynder
11. juni 2003 - 21:40 #10
det ændrer ikke noget kan jeg så lige sige med det samme!
Avatar billede arne_v Ekspert
11. juni 2003 - 21:42 #11
Og du får stadig for mange records men ingen fejl ?
Avatar billede naesbygaard Nybegynder
11. juni 2003 - 21:42 #12
hov! rettelse :) Det virker! Den havde lavet +1 på alle værdier i databasen da jeg konverterede.
Avatar billede naesbygaard Nybegynder
11. juni 2003 - 21:46 #13
Kan man med fordel omskrive den til noget med en join? Eller er det det bedste man kan gøre her? (og vil du have point på du lige smide et svar)

Dette er den valgte! :
SELECT t2.* FROM t2, t3 WHERE t2.status = 1 AND t3.tabel2id = t2.id AND (t3.tabel1id = 5 or t3.tabel1id = 6 or t3.tabel1id = 7) ORDER BY t2.nummer
Avatar billede arne_v Ekspert
11. juni 2003 - 21:50 #14
Jeg kan ikke se nogen fordel ved at bruge join (medmindre der er
bedre performnace, hvilket jeg ikke kender MySQL godt nok til at kunne
udtale mig om).

Det vil i så fald være:

SELECT t2.* FROM t2 JOIN t3 ON t3.tabel2id = t2.id WHERE t2.status = 1 AND (t3.tabel1id = 5 or t3.tabel1id = 6 or t3.tabel1id = 7) ORDER BY t2.nummer
Avatar billede naesbygaard Nybegynder
16. juni 2003 - 15:32 #15
tak
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