Avatar billede thb Nybegynder
17. maj 2005 - 08:37 Der er 19 kommentarer og
2 løsninger

SQL where not in

Hej alle,

Jeg har 2 tabeller.
En med billeder og en der mapper dem sammen med et item.

Jeg har nu lavet en side hvor der er en select box med alle billederne, så kan man vælge et billede og så bliver det added til det valgte item.

Men jeg vil gerne lave sådan at billeder som allerede et bundet til det valgte item ikke bliver vist i select'en, hvordan gør jeg det...

Jeg har prøvet at skrive WHERE NOT IN... men jeg kan ikke lige få det til at virke..

SELECT * FROM billede_tabel WHERE NOT IN (SELECT * FROM map_tabel WHERE item_id = $_GET["item_id"])

Men det er vist ikke just rigtigt..

Thomas
Avatar billede thb Nybegynder
17. maj 2005 - 08:38 #1
Jeg kan lige sige at når jeg bruge den sql så kommer der ingen billeder i selecten lige meget hvilket item_id der er...

Thomas
Avatar billede busschou Praktikant
17. maj 2005 - 08:46 #2
Du skal jo sige hvad det er der er "NOT IN"... er det et ID jamen så
SELECT * FROM billede_tabel WHERE item_id NOT IN (SELECT * FROM map_tabel WHERE item_id = $_GET["item_id"])
Avatar billede nielle Nybegynder
17. maj 2005 - 08:49 #3
SELECT * FROM billede_tabel WHERE billede_id NOT IN (SELECT billed_id FROM map_tabel WHERE item_id = $_GET["item_id"])
Avatar billede busschou Praktikant
17. maj 2005 - 08:50 #4
ved egentlig ikke om IN virker på den måde.. men du skal selvfølgelig også kun udvælge det id der sammenlignes på
SELECT * FROM billede_tabel WHERE item_id NOT IN (SELECT item_id FROM map_tabel WHERE item_id = $_GET["item_id"])
Avatar billede nielle Nybegynder
17. maj 2005 - 09:14 #5
busschou> Jeg gætter på at:

(SELECT item_id FROM map_tabel WHERE item_id = $_GET["item_id"])

- nok kan skrives på en mindre avanceret facon. ;^)

Eftersom at thb skriver at det er tabel nr. 2 som binder billedet sammen med et item, så gætter jeg på at det stadig er noget i stil med:

SELECT * FROM billede_tabel WHERE billede_id NOT IN (SELECT billede_id FROM map_tabel WHERE item_id = $_GET["item_id"])

- selv om det selvfølgeligt er et rent gæt fra min side at det pågældende billede-id faktisk hedder "billede_id".
Avatar billede busschou Praktikant
17. maj 2005 - 09:16 #6
nielle >> ja selvfølgelig..lol.. det var blot for at tage et navn på et id..men ja..lige netop præcis det eeene navn...der går den nok ikke så skide godt nej ;o)
Avatar billede thb Nybegynder
17. maj 2005 - 10:28 #7
Det er nok det jeg mangler... :)

Jeg har ikke prøvet at bruge den NOT IN før, og så tænkte jeg ikke lige så langt.

Jeg tester lige når jeg kommer hjem i aften, men sqlen skal nok se således ud:

SELECT * FROM billede_tabel WHERE pic_id NOT IN (SELECT pic_id FROM map_tabel WHERE item_id = $_GET["item_id"])

Det virker sikkert, så i kan jo lige smide nogle svar..

Thomas
Avatar billede busschou Praktikant
17. maj 2005 - 10:34 #8
jamen svar :o)
Hvis ikke det virker som ønsket så skriv ind igen
Avatar billede nielle Nybegynder
17. maj 2005 - 11:18 #9
Svar :^)
Avatar billede thb Nybegynder
17. maj 2005 - 23:42 #10
Hmm... Er først ved min computer nu...
Har lige prøvet at skrive sql'en sådan her:

SELECT * FROM billede_tabel p WHERE p.pic_id NOT IN (SELECT * FROM map_tabel WHERE item_id = 3) ORDER BY p.pic_id ASC

Men det virker stadigvæk ikke...
Den kommer med mysql_error() = You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT * FROM map_tabel WHERE item_id = 3)

Nogle der ved hvad jeg skal gøre..

Thomas
Avatar billede busschou Praktikant
18. maj 2005 - 07:20 #11
hrm.. det er ikke fordi der skal ' omkring id.. altså '$_GET["item_id"]'
Ellers kunne det tyde på som vi var inde på at du skal selecte et id og ikke alt
IN opererer normalt på en tupel, altså fx
Select * From tabel Where id Not In (2,3,4)
Hvis du vælger * så kunne dit eksempel måske give
Select * From billede_tabel Where pic_id Not In (2,brian,kbh,4,benny,århus)
--
Så prøv udskifte stjernen så du kun får de ID du ikke er interesseret i
FX
SELECT * FROM billede_tabel p WHERE p.pic_id NOT IN (SELECT item_id FROM map_tabel) ORDER BY p.pic_id ASC
--
I øvrigt så er din sql ikke så spændende hvis du sammenligner på id og du kun hiver item_id = 3 ud. Så kunne du ligeså godt sige
SELECT * FROM billede_tabel p WHERE p.pic_id NOT IN (3) ORDER BY p.pic_id ASC
Som igen er det samme som
SELECT * FROM billede_tabel p WHERE p.pic_id <> 3 ORDER BY p.pic_id ASC
Avatar billede thb Nybegynder
18. maj 2005 - 07:35 #12
Det vil jeg prøve...

Når jeg siger item_id = 3 så kommer der en masse billeder ud.
Det er fordi at i billede_tabel er der en masse billede, som så bileder sat sammen med nogle items i map_tabellen, så vil sige at ved item_id = 3 kan det være at billede 3,5,8 dukker op, så de 3 billeder vil jeg gerne have fjernet fra den select som viser de billeder som du kan tilføje.

Jeg synes ikke det er fedt hvis man kan tilføje det samme billede flere gange...

Thomas
Avatar billede nielle Nybegynder
18. maj 2005 - 18:29 #13
Nu er jeg ikke helt up-to-date mht. MySQL, men det er ikke mange versioner siden at den ikke understøttede sub-selects. Måske er det det som er i vejen. Ved du hvilken version du bruger?
Avatar billede thb Nybegynder
18. maj 2005 - 19:29 #14
Jeg har version 4.0.22.... Ved ikke om det er godt nok...
Og det er jo også kun lokalt, har ikke lige tjekket hvad der er på serveren..

Nu har jeg rettet sqlen lidt til så der kommer ikke fejl mere, men nu virker det bare ikke...

Så du har sikkert ret nielle... ØV bøv... :)
Så må jeg bare lave det over flere sql'er...

Thomas
Avatar billede nielle Nybegynder
18. maj 2005 - 20:44 #15
Du skriver 17/05-2005 23:42:41 at du har testet med:

SELECT * FROM billede_tabel p WHERE p.pic_id NOT IN (SELECT * FROM map_tabel WHERE item_id = 3) ORDER BY p.pic_id ASC

Var det ikke:

SELECT * FROM billede_tabel WHERE pic_id NOT IN (SELECT pic_id FROM map_tabel WHERE item_id = 3) ORDER BY pic_id ASC

Du ville prøve? Den første version bør under alle omstændigheder give en fejl, mens der stadig er håb for den sidste.
Avatar billede nielle Nybegynder
18. maj 2005 - 20:50 #16
Subselects blev introduceret i MySQL fra version 4.1 - tough luck :^(
Avatar billede thb Nybegynder
18. maj 2005 - 20:50 #17
Min sql ser sådan her ud:

SELECT * FROM billede_tabel WHERE pic_id NOT IN ('SELECT pic_id FROM map_tabel WHERE item_id = 3') og den melder ikke fejl længere, men den fjerner heller ikke noget ....

Thomas
Avatar billede nielle Nybegynder
18. maj 2005 - 21:39 #18
Der skal i hvert fald ikke være pinger rundt om den indre SELECT-sætning - ellers bliver den under alle omstændigheder behandlet som et stykke tekst i stedet for som en SQL-kommando.
Avatar billede thb Nybegynder
19. maj 2005 - 00:00 #19
Okay, men det fik fejlen til at gå væk... :D
Den fejl som jeg skrev tidligere.

Jeg tror bare at jeg laver det i 2 sql'er..
Tak for hjælpen...

Thomas
Avatar billede nielle Nybegynder
19. maj 2005 - 06:40 #20
LOL. Ja, man kan jo altid få alle fejl til at forsvinde, hvis man f.eks. udkommentere alt sin kode. Men det er sjældent den rigtige løsning. ;^)

Det lader unægtelig til at du må gøre det over 2 SQL'er. Først en loop over den "ydere SQL" hvor du laver et array og til dette tilføjer de mulige pic_id'er. Derefter en loop over den "indre SQL" hvor du fratrækker de pic_id'er som allerede er brugt.
Avatar billede thb Nybegynder
19. maj 2005 - 07:33 #21
Nemlig...
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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