Avatar billede yxos Nybegynder
16. december 2006 - 18:21 Der er 18 kommentarer og
1 løsning

Hjælp til SQL

Jeg er webmaster for en forening hvor brugerne er medlemmerne af foreningen.
Hjemmesiden er lavet i et CMS system, der benytter PHP.

Når brugerne er meldt til, skal de opdatere deres profil med deres fulde navn, for at vi kan holde styr på, at vores brugere er dem vi ønsker.

Jeg ønsker at lave en lille liste der viser dem, der IKKE har opdateret deres profil med deres navn endnu.

Nu er der bare det, at navnet ligger i en anden tabel end den sædvanlige brugertabel.

min SELECT skal altså omfatte 2 tabeller, og ende med et array som kun indeholder brugerne uden fulde navn.

De to tabeller er:

1. table users:
user_id  smallint(5)
user_name  varchar(25)  (dette er brugernavn)

2. table extended_profile_values
prop_name      varchar(25)
prop_user_id  smallint(5)
prop_value    text

Tabel 1 inderholder alle brugerne. Nøgle: user_id
Tabel 2 inderholder ekstra felter pr user_id.
De felter i tabel 2 der er interessante er dem hvor prop_name = 'fuldnavn', og hvor prop_text = blank.

Der er så ydeligere den krølle, at der ikke altid findes en record i tabel 2 for en bruger i tabel 1.

Så min SQL SELECT skal altså udvælge brugere fra tabel 1 hvor:

A. der ikke finde nogen relateret record i tabel 2, hvor prop_name = 'fuldnavn'

eller

B. Der findes en relateret record i tabel 2, hvor prop_name = 'fuldnavn', men hvor prop_value = blank.


hvordan skal min SELECT sql se ud?
Avatar billede kalp Novice
16. december 2006 - 19:42 #1
SELECT user_name FROM users WHERE user_id NOT IN (SELECT prop_user_id, prop_name, prop_value FROM extended_profile_values WHERE prop_name = 'fuldnavn' AND prop_value = blank) 

ja altså opbygningen skal være sådan.. så skal du bare selv lige rette

WHERE prop_name = 'fuldnavn' AND prop_value = blank) 


kan ikke lige se om der skal stå fuldnavn eller hvad du mener.. eller om prop_value skal være = "" men vil mene sql'en skal være sådan der
Avatar billede yxos Nybegynder
17. december 2006 - 09:37 #2
Nu har jeg prøvet det men jeg får en fejl:

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 'WHERE user_id NOT IN (SELECT prop_name, prop_user_id, prop_value FROM extended_profile_value' at line 1

Bemærk, jeg har byttet om på prop_user_id og prop_name i SELECT'en fordi primary key i tabellen extended_profile_value er: prop_name, prop_user_id.

Men det hjalp ikke.
Men kan det have noget at sige, at tabellen har to felter som primary key ?
Avatar billede kalp Novice
17. december 2006 - 09:40 #3
SELECT user_name, user_id FROM users WHERE user_id NOT IN (SELECT prop_user_id, prop_name, prop_value FROM extended_profile_values WHERE prop_name = 'fuldnavn' AND prop_value = blank) 

jeg manglede i hvertfald lige at selecte user_id så det kan godt være det
Avatar billede yxos Nybegynder
17. december 2006 - 09:50 #4
Jeg har prøvet med:

SELECT * FROM users WHERE user_id NOT IN (SELECT prop_user_id, prop_name, prop_value FROM extended_profile_values WHERE prop_name = 'fuldnavn' AND prop_value = blank)

Men det virker heller ikke.

Jeg tror problemet ligge ved "NOT IN(SELECT..." 
Mon det er MySQL der har en anden syntax ?
Avatar billede kalp Novice
17. december 2006 - 09:56 #5
ja det kunne godt se sådan ud. men så burde det virke med

SELECT * FROM users WHERE user_id IN (SELECT prop_user_id, prop_name, prop_value FROM extended_profile_values WHERE prop_name = 'fuldnavn' AND prop_value = blank)


dog med den undtagelse at listen er forkert...
Avatar billede kalp Novice
17. december 2006 - 09:59 #6
det hedder nok noget andet i My SQL... mon det er dette?

SELECT * FROM users WHERE user_id NOT EXISTS (SELECT prop_user_id, prop_name, prop_value FROM extended_profile_values WHERE prop_name = 'fuldnavn' AND prop_value = blank)
Avatar billede yxos Nybegynder
17. december 2006 - 10:06 #7
Nej, de giver begge samme fejl.

Hvad en meningen med den IN?
Hvordan skal SELECT nummer 2 vide, hvilket felt den skal sammenligne med user_id fra den første select?

Iøvrigt; tabel to har kun de tre felter; prop_name, prop_user_id, prop_value
Så er det ikke det samme at skrive:
SELECT *  eller
SELECT prop_name, prop_user_id, prop_value  ?
Avatar billede kalp Novice
17. december 2006 - 10:10 #8
Når man skriver user_id IN så tjekker den om user_id findes i det udtræk select nr. 2 laver... men da vi gerne vil dem som ikke findes i select nr. 2 skriver jeg not in eller not exists.. nu programmere jeg normalt op imod MS SQL  så ved ikke helt om syntax er forkert lige der.
men ellers kan du godt skrive SELECT * i select nr. 2 ja.
Avatar billede kalp Novice
17. december 2006 - 10:13 #9
du kan se her om IN http://www.w3schools.com/sql/sql_in.asp

det er bare underligt at du ikke kan bruge IN alene
Avatar billede yxos Nybegynder
17. december 2006 - 12:12 #10
Så, nu virker den, syntaxmæssigt:

SELECT * FROM users WHERE
user_id NOT IN (SELECT prop_user_id FROM extended_profile_values WHERE prop_name = 'fuldnavn' AND prop_user_id = user_id AND prop_value = '')

Men funktionsmæssigt mangler den noget.
tabel users har 18 records. Ud af dem, er der kun 1, der har en relateret record i extended_profile_values, hvor prop_name = 'fuldnavn' og prop_value = ''.
De resterende mangler enten en relateret record, eller også så har de udfyldt noget i prop_value.

Det passer også meget godt, for sætningen ovenover returnerer 17 records.

Jeg tror der skal pusles videre med måske en LEFT JOIN...
Avatar billede kalp Novice
17. december 2006 - 12:29 #11
okay... hvad mangler der at filtreres fra i resultatet?
Avatar billede yxos Nybegynder
17. december 2006 - 14:06 #12
Det er ikke gjort med at filtrere yderligere, for den ene der lige nu mangler, er faktisk en af dem jeg GERNE vil se.

Hvis du ser på min indledende beskrivelse, så svarer det til, at din SQL har taget det MODSATTE af krav B.

Lad os tage et eksempel:

4 Users.user_id:
Peter
Ole
Niels
Henrik

extended_profile_values:
prop_name  prop_user_id  prop_value
fuldnavn  Peter        Peter Jensen
telefon    Peter        1234 5678
fuldnavn  Niels
telefon    Niels   
fuldnavn  Henrik        Henrik Hansen
telefon    Henrik        2345 6789

(skal nok kopieres over i Notepad for at give mening aht formateringen...)

Min select skal vælge Ole og Niels !
Ole fordi der ikke findes nogen record for 'Ole' med 'Fuldnavn'
Niels fordi der findes en record for 'Niels' med 'Fuldnavn', men prop_value er blank.


Giver det mere mening nu?
Avatar billede yxos Nybegynder
17. december 2006 - 14:08 #13
Peter og Henrik har begge en record med 'Fuldnavn' og en udfyldt prop_value. Derfor skal de IKKE med.
Avatar billede kalp Novice
17. december 2006 - 14:13 #14
hvis det er modsat skal du bare gøre sådan... men læser lige dit indlæg

SELECT * FROM users WHERE
user_id NOT IN (SELECT prop_user_id FROM extended_profile_values WHERE prop_name <> 'fuldnavn' AND prop_user_id = user_id AND prop_value <> '')
Avatar billede kalp Novice
17. december 2006 - 14:17 #15
har forstået det nu.. men du må godt lige se om den sql gør det
Avatar billede yxos Nybegynder
17. december 2006 - 16:09 #16
Bingo!  :-)

Smid et svar
Avatar billede kalp Novice
17. december 2006 - 16:50 #17
he he det får du her=)
Avatar billede yxos Nybegynder
17. december 2006 - 17:39 #18
Hm. Fik svaret for hurtigt.

Select 2 virker kun tilsyneladende.

Sådan skal den se ud (med prop_name = 'fuldnavn):

SELECT * FROM users WHERE
user_id NOT IN (SELECT prop_user_id FROM extended_profile_values WHERE prop_name = 'fuldnavn' AND prop_user_id = user_id AND prop_value <> '')
Avatar billede kalp Novice
17. december 2006 - 17:43 #19
okay ja hvis der skal stå fuldnavn=)

men den er fin nu?
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