16. december 2006 - 18:21Der 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.
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
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 ?
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
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 ?
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)
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)
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 ?
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.
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...
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.
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 <> '')
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 <> '')
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.