MySQL, sökfråga med urval...

Tråden skapades och har fått 4 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Höganäs
  • 2003-03-24 19:35

Jag har ett projekt på G, där jag via ett forumlär vill knyta en rad skolämnen till en viss användare (lärare) och klass.
Här kommer först ett försök till förklaring av funktionen. Själva problemet jag har beskrivs längre ned...

När man loggat in och valt sidan för att koppla ämne till lärare visas först ett forumlär där man väljer en klass ur en meny och klickar OK.
Därefter visas en popupmeny med ämnen välja från.
När man valt ämne, ex "Ma" , läggs detta in i tabellen amnen_users med uppgifter om klass, ämne och user, se nedan.
På nytt visas sidan med val av ämne, men nu vill jag att endast icke valda ämnen ska visas i menyn!

Detta går att ordna med följande söksträng, men problemet är att den sökningen inte tar hänsyn till:
1. Om man är inloggad som en annan användare
2. Om man valt en annan klass

Söksträng:
mysql> select amnen.* from amnen LEFT JOIN amnen_users ON amnen.amnesid=amnen_users.amne WHERE amnen_users.amne IS NULL;

Nu till problemet:
Hur kan jag skapa en sökning som ger mig alla ämnen att välja på om jag är inloggad som en annan användare eller väljer en annan klass!?

Tabeller:
"amnen":

+---------+------+
| amnesid | amne |
+---------+------+
| 1 | Ma |
| 2 | Sv |
| 3 | Bild |
| 4 | Eng |
| 5 | No |
| 6 | Id |
+---------+------+

"users":
+--------+--------+-------+----------+----------+
| userid | fnamn | enamn | username | password |
+--------+--------+-------+----------+----------+
| 1000 | Micke | F | micke | XXXXX |
| 1001 | Kalle | Anka | kalle | XXXXX |
| 1002 | DEMO | DEMO | DEMO | XXXXX |
+--------+--------+-------+----------+----------+

"amnen_users":
+----+-------+------+------+
| id | klass | amne | user |
+----+-------+------+------+
| 1 | 1 | 1 | 1000 |
| 2 | 1 | 2 | 1000 |
| 3 | 1 | 5 | 1000 |
| 4 | 1 | 6 | 1000 |
| 5 | 1 | 1 | 1000 |
+----+-------+------+------+

mysql> select amnen.* from amnen LEFT JOIN amnen_users ON amnen.amnesid=amnen_users.amne WHERE amnen_users.amne IS NULL;

ger resultatet:
+---------+------+
| amnesid | amne |
+---------+------+
| 3 | Bild |
| 4 | Eng |
+---------+------+

Detta vill jag alltså ska förändras till att visa alla ämnen om jag väljer annan klass eller är inloggad som någon annan.

Hoppas på hjälp! (och hoppas det går att förstå min förklaring... )

/Micke

ps. Bifogar fil med mysql-dump så den som känner sig hugad kan skapa tabellerna!

SELECT amnen.*
FROM amnen LEFT JOIN amnen_users ON amnen.amnesid=amnen_users.amne
WHERE
amnen_users.amne IS NULL OR
amnen_user.user != 'mitt user id' OR
amnen_user.klass != 'vald klass'

Är det så här du menar eller har jag missförstått dig? (kändes lite för enkelt...)

  • Medlem
  • Höganäs
  • 2003-03-26 12:51

Hmm.
Nä, den varianten har jag provat. Resultatet blir att om jag ex väljer ämnet "Ma" ur popupmenyn och klickar ok, visas istället två "Ma" nästa gång jag ska göra valet. Istället vill jag ju att "Ma" ska saknas bland alternativen.

Problemet är alltså att när en annan "user" är inloggad och/eller om en annan klass väljs, ska alla ämnen visas på nytt.

Den söksträng jag angett visar upp valbara ämnen som har värdet NULL i amnen_users.amne

Om jag modifierar den ursprungliga söksträngen till:
select * from amnen LEFT JOIN amnen_users ON amnen.amnesid=amnen_users.amne WHERE amnen_users.amne IS NULL;

(select * istället för select amnen.*)
blir resultatet:
+---------+------+------+-------+------+------+
| amnesid | amne | id | klass | amne | user |
+---------+------+------+-------+------+------+
| 2 | Sv | NULL | NULL | NULL | NULL |
| 3 | Bild | NULL | NULL | NULL | NULL |
| 4 | Eng | NULL | NULL | NULL | NULL |
| 5 | No | NULL | NULL | NULL | NULL |
| 6 | Id | NULL | NULL | NULL | NULL |
+---------+------+------+-------+------+------+

Om nu det kan ge någon ledtråd...

ok, nu tror jag att jag är med på vad du är ute efter. Så här borde det fungera:

SELECT amnen.*
FROM amnen LEFT JOIN amnen_users ON
amnen_user.user = 'mitt user id' AND
amnen_user.klass = 'vald klass' AND
amnen.amnesid=amnen_users.amne
WHERE amnen_users.amne IS NULL

Det går även att lösa det med en subselect, vilket jag tycker är snyggare (men det är ju bara min åsikt )

SELECT * FROM amnen a
WHERE NOT EXISTS (
SELECT * FROM amnen_user au
WHERE au.user='mitt user id' AND
au.klass = 'vald klass' AND
au.amne = a.amnesid)

  • Medlem
  • Höganäs
  • 2003-03-26 23:40
Citat:

Skrevs ursprungligen av Erik Lorentzson
ok, nu tror jag att jag är med på vad du är ute efter. Så här borde det fungera:

SELECT amnen.*
FROM amnen LEFT JOIN amnen_users ON
amnen_user.user = 'mitt user id' AND
amnen_user.klass = 'vald klass' AND
amnen.amnesid=amnen_users.amne
WHERE amnen_users.amne IS NULL

YES!

Tack tack tack tack tack tack tack tack tack tack !

1
Bevaka tråden