"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

MySql Subquery Ersatz

alexsb 10.06.2003 - 16:50 1131 4
Posts

alexsb

hmm
Avatar
Registered: Jun 2001
Location: near Graz
Posts: 1566
Hi,

Für das folgende Problem ist die Plattform Apache/php/MySQL

Ich habe 2 Tabellen, die eine ist eine Kreuztabelle zwischen User und Filmen, die andere ist eine Tabelle die Filme enthält. Ich möchte alle Filme die ein gewisser User nicht hat anzeigen. Das (meiner Meinung nach) korrekte SQL Statement wäre:

SELECT * FROM tb_movie where mid = (Select r_mid from tb_user_x_movie where r_uid <> '$uid')

Da MySQL aber keine Subquerys unterstützt hab ich ein Problem. Ich versuche das zu umgehen indem ich eine Funktion schreibe die mir die Werte der Subquery zurückgibt, aber ich weiss nicht ob ich in PHP Arrays returniern kann. Ich könnte es natürlich ohne zusätzliche Funktion machen, aber das ist nicht besonders elegant.
Ich bitte um Hilfe.

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
a) da du eine submenge zurückgibst, müsstests du "EXISTS" bzw "NOT EXIST"S verwenden oder ein "IN" bzw "NOT IN".

b) die frage ist, möchtest du alle zur auswahl die andere user im moment besitzen, man selbst aber nicht, oder möchtest du wirklich alle, die man selber im moment nicht besitzt ?

c) ich gluaube, du kannst das mit einem join so oder so ähnlich auflösen

select distinct m.* from tb_movie m, tb_user_x_movie uxm where m.mid = uxm.r_mid and not uxm.r_uid ='$uid';

flaimo

ILFTKYS
Avatar
Registered: Dec 2001
Location: ask a ninja
Posts: 872
sollte doch auch mit einem left join funktionieren....

alexsb

hmm
Avatar
Registered: Jun 2001
Location: near Graz
Posts: 1566
Danke mal, sollte das nicht gehen:

SELECT * FROM tb_movie LEFT JOIN tb_user_X_movie on tb_movie.mid = tb_user_X_movie.r_mid AND tb_user_X_movie.r_uid <> 1

ich krieg da die erste tabelle mit den werten voll gekreuzt mit der zweiten Tabelle mit nur NULL werten

edit:

Die Folgende Query bringt mir genau das Gegenteil:

"SELECT * FROM tb_movie INNER JOIN tb_user_X_movie on tb_movie.mid = tb_user_X_movie.r_mid AND tb_user_X_movie.r_uid = '$uid'"

gibt mir alle anziegen die ein User hat
Bearbeitet von alexsb am 13.06.2003, 16:43

alexsb

hmm
Avatar
Registered: Jun 2001
Location: near Graz
Posts: 1566
SELECT * FROM tb_movie INNER JOIN tb_user_X_movie on tb_movie.mid = tb_user_X_movie.r_mid AND tb_user_X_movie.r_uid <> '$uid'

ich bin jetzt draufgekommen das das eigntlich funktioniert, es zeigt mir alle die man selbst nicht besitzt aber die wer anders besitzt. Ich habe das sowieso so gelöst das jeden eingefügten Film jemand besitzen muss, also ist das Problem gelöst, danke
Bearbeitet von alexsb am 13.06.2003, 19:35
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz