Avatar billede ihtezaz Praktikant
29. september 2006 - 00:37 Der er 33 kommentarer og
3 løsninger

SELECT id hvor en kolonne værdi

Jeg har en tabel kaldet "picLink",
tabelen har en kolonne "photoID" og en kolonne "keywordID" og en id kolonne.

Det jeg ønsker, er at kunne selecte alle fotoer der f.eks. har keywordid = 151 og ikke keywordid = 400

Samme photoID forkommer flere gange i forskellige rækker, med forskellige keywordID's

Hvordan skal min sql sætning lige se ud ?
Avatar billede ilflue Nybegynder
29. september 2006 - 00:41 #1
"SELECT * FROM picLink Where keywordid = 151"  så tager den kun dem med keywordid 151
Avatar billede lasserasch Juniormester
29. september 2006 - 01:05 #2
Ja, * kan man vel så diskutere. Der selecter den jo også keywordid ud igen, hvilket giver et størrere recordset en nødvendigt.

Burde være : "Select id, photoId where keywordid = 151".
Dermed antaget at keywordid er int eller i hvert fald ikke varchar.

Hvis feltet kan indeholde andet en tal skulle det jo så være :
"Select id, photoId where keywordid = '151'"

/Lasse
Avatar billede ilflue Nybegynder
29. september 2006 - 01:48 #3
Først og fremmest skulle det være "Select id, photoId FROM picLink where keywordid = 151".

For det andet, så ja. Så længe keywordid ikke skal udskrives, kunne det være muligheden Men hvis man nu udskriver fra 140 til 160 og ønsker keywordid udskrævet, så skal den også med
Avatar billede coderdk Praktikant
29. september 2006 - 01:58 #4
Han har en mange-til-mange relation, han vil kun have de photoid'er der har fået tildelt keywordid 151, med undtagelse af dem der også har fået tildelt keywordID 400

i.e.:

picLink
-------
photoID
keywordID

photo
-----
photoID
felt2
felt3

Det var i hvert tilfælde sådan jeg forstod det i et andet spørgsmål tidligere på dagen
Avatar billede ihtezaz Praktikant
29. september 2006 - 09:16 #5
coderdk har fuldstændig ret., hvordan kan det løses ?
Avatar billede lorentsnv Nybegynder
29. september 2006 - 09:49 #6
Kan det ikke løses således:

select *
from picLink
where keywordid = 151
and id not in (Select id from picLink where keywordid = 400)
Avatar billede ihtezaz Praktikant
29. september 2006 - 10:06 #7
Det fungere desværre ikke helt.
Avatar billede lorentsnv Nybegynder
29. september 2006 - 10:17 #8
Fungerer det heller ikke med

select *
from picLink
where keywordid = 151
and photoID not in (Select photoID from picLink where keywordid = 400)

(Jeg havde brugt ID i stedet for photoID i den første.

Kan du forklare lidt nærmere hvad det eventuel er som ikke fungerer?
Avatar billede ihtezaz Praktikant
29. september 2006 - 10:57 #9
Sorry, jeg havde overset, at kategorien, jeg har en mysql db. så det kan være derfor det ikke helt fungere.
Avatar billede ilflue Nybegynder
29. september 2006 - 11:37 #10
select id,photoID from picLink where keywordid = 151 OR keywordid = 151 ???
Avatar billede ilflue Nybegynder
29. september 2006 - 11:37 #11
UPS!!!

select id,photoID from picLink where keywordid = 151 OR keywordid = 400
Avatar billede lorentsnv Nybegynder
29. september 2006 - 11:47 #12
Jeg vil umiddelbart mene at de fleste SQL'er overfor vil fungere både på MySQL og SQL Server.
Avatar billede coderdk Praktikant
29. september 2006 - 11:50 #13
Sub-selects virker ikke i mysql 4
Avatar billede ihtezaz Praktikant
29. september 2006 - 11:52 #14
iflue >> sådan får jeg jo også resultater der har keywordid = 400.

Ok, jeg prøver lige igen med din version lorentsnv
Avatar billede ilflue Nybegynder
29. september 2006 - 12:54 #15
Tror jeg har helt misforstået spørgsmålet...

og *coderdk* Subselect har en bug i MySQL 4 ja, men det virker igen fra 4.1
Avatar billede ihtezaz Praktikant
29. september 2006 - 13:01 #16
iflue, hvordan kunne den evt. tilrettes til at virke i 3.4 vers.
Avatar billede ilflue Nybegynder
29. september 2006 - 13:03 #17
Ja det er svær. For Subselect var først regnet at skulle virke i 4.0, det gjorde det så ikke, men blev rettet i 4.1.
Avatar billede ilflue Nybegynder
29. september 2006 - 13:06 #18
Du kan jo lave en SQL sætning først der søger IDen på de PhotoIDer der har piclink 400, og så lave en SQL sætning hvor du søger keywordid 151 med undtagelse af de første IDer. Men det ville blive noget rod tror jeg.
Avatar billede lorentsnv Nybegynder
29. september 2006 - 13:13 #19
Hvad med at bruge EXISTS, findes denne funkton i tiligere MySQL (Jeg fandt noget dokumentation på denne funktion og MySQL fra 2002).

select *
from picLink
where keywordid = 151
and photoID NOT EXISTS(Select photoID from picLink pl where pl.photoID = pickLink.photoID and keywordid = 400)
Avatar billede ilflue Nybegynder
29. september 2006 - 13:21 #20
Desværre. Den er vist findes vist først i 4.1.
Men fandt vist en måde at omskrive det på, så det virker i ældre versioner.
Men jeg er desværre ikke haj nok til at fatte 100% denne metode.
Så hvis lorentsnv lige vil kikke ind her http://www.hupo.org.cn/docs/mysql/manual_SQL_Syntax.html#Rewriting_subqueries

Tror du kan få mere ud af det end mig
Du skal ned til sektion 13.1.8.11
Avatar billede lorentsnv Nybegynder
29. september 2006 - 13:35 #21
Jeg må desværre melde pas, og foreslå at du flytter spørgsmålet over til MySQL emnet. Jeg kigget på koden i sektoin 13.1.8.11, men den kan ikke bruges direkte, da forslaget med Not Exist bruger en link mellem to foreskellige tabeller. Her er der behov for at linke til samme tabel to gange, og egentlig filtrere indholdet af de to instaces af tabellen, inden linken laves.
Avatar billede ilflue Nybegynder
29. september 2006 - 13:37 #22
*loren* Ja, også der jeg gik død
Avatar billede ilflue Nybegynder
29. september 2006 - 14:02 #23
SELECT *
FROM picLink R,picLink L
WHERE R.id=L.id AND R.keywordid 151 AND NOT ...

Kan man ikke gøre det i stil med det???
Avatar billede henninghabor Nybegynder
29. september 2006 - 14:05 #24
SELECT * FROM picLink WHERE keywordid = 151 AND keywordid <> 400
Avatar billede ilflue Nybegynder
29. september 2006 - 14:08 #25
*henninghabor* Går ikke. Han skal kun have de keywordider som ikke har en photoID tilsvarene en en anden photoID med samme ID, men med keywordid på 400
Avatar billede ilflue Nybegynder
29. september 2006 - 14:12 #26
SELECT *
FROM picLink R,picLink L
WHERE NOT R.photoID=L.photoID AND L.keywordider = 400

Er ikke sikker på at R og L metoden virker i dette sammenhæng, men hvis det gør, Burde den her at virke???
Avatar billede henninghabor Nybegynder
29. september 2006 - 14:13 #27
Ok, det er jo ikke det der bliver spurgt efter. At han så tidligere har oprettet et spørgsmål hvor han bedre forklarer problemstillingen har han jo ikke gjort opmærksom på. :)
Avatar billede ilflue Nybegynder
29. september 2006 - 14:14 #28
He he. Opfattede det på samme måde til at starte med :D
Avatar billede henninghabor Nybegynder
29. september 2006 - 14:15 #29
ilflue 29/09-2006 14:12:11>>Bør der ikke være en AS?

SELECT * FROM picLInk AS R, picLink AS L
Avatar billede coderdk Praktikant
29. september 2006 - 14:17 #30
itzaz, Måske du skulle flytte spørgsmålet over i MySQL ;)
Avatar billede ilflue Nybegynder
29. september 2006 - 14:19 #31
*henninghabor* Troede jeg også, men det lader det ikke til.
Avatar billede ilflue Nybegynder
29. september 2006 - 14:23 #32
Tja, min metode virker ... Den skal bare lige tilrettes
Avatar billede ilflue Nybegynder
29. september 2006 - 14:39 #33
SELECT * FROM picLink R LEFT JOIN picLink L ON R.id=L.id WHERE NOT L.keywordider = 400 AND L.photoID=R.photoID

Sådan. Den der virker. Jeg er ikke helt sikker på at betingelsen er helt rigtig.
Men det funker
Avatar billede ilflue Nybegynder
29. september 2006 - 15:24 #34
Når, men som sagt af to andre.
Smid det ind til MySQL folkene. Tror du skal have en RIGHT JOIN på også for at få hele din betingelse med. Kan sagtens få den til at gøre hvad den skal, men så lopper den det samme info flere gange...
Avatar billede pierrehusted Nybegynder
29. september 2006 - 23:33 #35
Det er dem her du gerne vil have:
SELECT DISTINCT photoID, keywordID FROM picLink WHERE keywordid = 151

Men photoID må ikke samtidig være med her:
SELECT DISTINCT photoID, keywordID FROM picLink WHERE keywordid = 400


Så mit bud er at LEFT OUTER JOINe de to, og kun tage dem med, som ikke har indhold i 400-sættet. F.eks. sådan her:


SELECT med.photoID, med.keywordID as med_keywordID, ikke.keywordID as ikke_keywordID
FROM
(SELECT DISTINCT photoID, keywordID FROM picLink WHERE keywordid = 151) AS med
LEFT OUTER JOIN
(SELECT DISTINCT photoID, keywordID FROM picLink WHERE keywordid = 400) AS ikke
ON med.photoID = ikke.photoID
WHERE ikke.keywordID IS NULL


Det virker på min MySQL, men det er en 4.1 - så jeg vil ikke garantere noget.
Avatar billede ihtezaz Praktikant
02. oktober 2006 - 11:07 #36
Jep det er gjort, troede det var så bøvlt at arbejde med mysql, men takker for jeres hjælp :)
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