2017-01-16 2 views
0

Ich versuche, eine MySQLi-Anweisung zu schreiben, wo ich eine zufällige Spalte (url) aus einer Tabelle namens (questions) abrufen möchte. Ich möchte jedoch nicht irgendeine zufällige url. Diese Anweisung hängt von drei Bedingungen ab, die eine andere Tabelle mit sich führen: tracking. tracking enthält drei Spalten (user_id, q_id, answer). Letztendlich möchte ich alle urls abrufen, die vom Benutzer noch nicht beantwortet wurden. Zum Beispiel, wenn der Benutzer eine Frage bereits beantwortet hat, dann tracking wird etwas wie dieses haben: user_id: 2q_id: 2answer: 1 Jetzt, wenn wir diese Aussage ausführen, sollte q_id: 2 nicht eine der zufälligen sein urls. Es ist auch wichtig darauf hinzuweisen, dass q_id auch ein Primärschlüssel von questions ist.Left Join funktioniert nicht zum Abrufen zufälliger Spalte

Ich habe diese Aussage versucht, aber es aus irgendeinem Grunde nicht funktioniert:

$values = $db->query(" 
SELECT url 
    FROM questions 
    LEFT 
    JOIN tracking 
    ON tracking.user_id = '$id' 
    AND questions.q_id != tracking.q_id 
    AND tracking.answer != NULL 
ORDER 
    BY rand() LIMIT 1 
"); 

Wie kann ich es so machen, ein zufälliges url mit Ausnahme der Fragen abgerufen wird, die bereits vom Benutzer beantwortet wurde?

Antwort

2

Sie versuchen, auf einem nicht gleich, so dass Sie am Ende mit einem 1: n-Join, was nicht funktioniert. (Nicht in diesem Fall).

so etwas wie dieses Versuchen:

SELECT url FROM questions WHERE q_id NOT IN 
     (SELECT q_id FROM tracking WHERE user_id = $id 
     AND answer IS NOT NULL) 
ORDER BY rand() LIMIT 1 

Und das ist kein speichern Möglichkeit Variablen in einer Abfrage einfügen, sehen Sie Prepared Statements: http://www.w3schools.com/php/php_mysql_prepared_statements.asp

+0

Hmm, ich erhalte eine Fehlermeldung, die besagt: 'Aufruf einer Memberfunktion fetch_array() auf einem Nicht-Objekt' Nach der Abfrage tue ich:' $ rows = $ values-> fetch_array(); ' – user2896120

+0

Testen Sie die Abfrage direkt in Ihrer db-Umgebung (wenn möglich) oder unter mindestens der mysql Fehler. echo mysql_errno ($ db). ":" mysql_error ($ db). "\ n"; –

+0

Hmm, es funktioniert jetzt, aber die Abfrage gibt immer noch eine URL, die aus irgendeinem Grund bereits beantwortet wurde ... – user2896120