2016-08-30 3 views
1
Table1 
    id | username | request 
--------|--------------|---------- 
    1 | user 1 | blah blah 
    2 | user 1 | blah2 
    3 | user 1 | blah3 
    4 | user 1 | blah4 
    5 | user 2 | blah1 

Table2 
    id | username | requestID 
--------|--------------|------------ 
    1 | user 2 |  1  

Die zurückgegebenen Ergebnisse für ‚user 2‘ sollte sein:PHP PDO MYSQL Verbindung Select-Anweisungen

table1.id = 2 
table1.id = 3 
table1.id = 4 

ich wählen erstellen müssen, die alle IDs aus der ersten Tabelle wählen, wo der Benutzername <> $ Benutzername (das ist einfach genug).

Ich brauche auch diese gegen Tabelle 2 abgestimmt, um sicherzustellen, dass der $ username nicht bereits ID aus Tabelle 1 übereinstimmenden RequestID aus Tabelle 2 (das ist, wo ich keine Ahnung, was zu tun ist) gesagt haben.

Ich weiß, wie man eine innere Verbindung macht, aber das scheint ein wenig komplexer als das. Mache ich zwei verschiedene Selects zusammen? Wie mache ich das?

Bestehende Code:

$stmt=$db->prepare("SELECT id FROM table1 WHERE username <> :user"); 
$stmt->bindParam(':user', $username); 
$stmt->execute(); 
$row = $stmt->fetch(); 

Hinzufügen

ich versucht habe, in Frage zu stellen eine innere Verknüpfung und es gibt nur einen Fehler auf der zweiten WHERE-Klausel: Unknown column 'table2.username' in ' where clause '.. aber die Tabelle sieht eindeutig eine Username-Spalte.

$stmt=$db->prepare("SELECT table1.id 
    FROM table1 
    INNER JOIN table2 
    ON table1.id = table2.requestID 
    WHERE table1.username <> 'user 1' 
    AND table2.username = 'user 1'"); 

MEHR ADDING klar, zu VERSUCHEN zu MACHEN MEHR

Ich glaube nicht, ein einfaches INNER JOIN mein Problem lösen wird, wie ich ursprünglich angegeben. Ich muss zuerst die Ergebnisse von Tabelle1 erhalten. Dann brauche ich diese Ergebnisse gegen table2 getestet, so dass NUR die Ergebnisse von table1, die vom aktuellen Benutzer NICHT erstellt wurden, zurückgegeben werden, und von diesen zurückgegebenen Ergebnissen sollten nur diejenigen zurückgegeben werden, die der Benutzer nicht in table2 aufgelistet hat.

Also ich vermute, ich werde nur zwei völlig separate Datenbankfunktionen zu tun haben.

$stmt=$db->prepare("SELECT id FROM table1 WHERE username <> :user"); 
$stmt->bindParam(':user', $username); 
$stmt->execute(); 
$row = $stmt->fetch(); 
$id = $row['id']; 

$stmt=$db->prepare("SELECT requestID FROM table1 WHERE username = :user"); 
$stmt->bindParam(':user', $username); 
$stmt->bindParam(':id', $id); 
$stmt->execute(); 
$rid = $stmt->fetch(); 

if $rid !== $id { //perform function } else {} 

ich dachte, dass es eine Art und Weise ausgewählte Aussagen zur Verbindung war, damit ich nicht 2 verschiedene Anrufe zu tun hatte, aber vielleicht falsch ich bin. Wie auch immer, ich sehe nicht, wie innerer Join dies erreichen wird ... aber ich bin offen für das Lernen.

NOCH MEHR UPDATES VERSUCHT, machen dies noch deutlicher

table1.id = 1 sollte nicht überein, da der Benutzer 2 eine table2.requestID hat die table1.id übereinstimmt; table1.id = 5 sollte nicht übereinstimmen, da Benutzer 2 der aufgelistete Benutzername für table1.id = 5 ist

Die anderen 3 Spalten sollten jedoch zurückkehren.

+0

Verwenden Sie einfach innere Join ich denke, es wird funktionieren –

+0

Wie sollte Ihre Ausgabe mit Tabelle1 und Tabelle2 zeigen Beispielausgabe zu wir – ashkufaraz

+0

Ich aktualisierte den Status der Frage zu versuchen, zu zeigen, dass ich Inner Join versucht habe und es funktioniert nicht. – Bruce

Antwort

1

Sie es IN

mit tun können
SELECT table1.id 
FROM table1 
WHERE table1.username <> 'user 2' 
and NOT table1.id IN (SELECT requestid FROM table2 WHERE username = 'user 2') 

oder mit LEFT JOIN

SELECT table1.id 
FROM table1 
LEFT JOIN table2 
ON table1.id = table2.requestID 
WHERE table1.username <> 'user 2' 
and (table2.username <> 'user 2' OR table2.username IS NULL) 

ich weiß nicht, welcher ist besser, aber sie haben die gleichen Ergebnisse

+0

Fügen Sie dies zu Tabelle1 hinzu: id => 2; id => 3; id => 4; Benutzername => Benutzer1; Benutzername => Benutzer1; Benutzername => Benutzer1; Anfrage => blah2; Anfrage => blah3; Anfrage => blah4; Ihr Endergebnis sollte nur table1.id = 2, table1.id = 3 und table1.id = 4 zurückgeben. Weil diejenigen, die nur die Ergebnisse von user2 nicht gemacht würde in table1 und in denen BENUTZER2 hat auch keinen aufgelistet table2.requestID die – Bruce

+0

Spiele table1.id Weder ist besser als keiner löst die gestellte Frage, weshalb es keine Antworten gibt vermarktet richtig. Wie gesagt, seit ich diese Frage zum ersten Mal gestellt habe, glaube ich nicht, dass Join funktionieren wird. Für Join sind übereinstimmende Daten erforderlich, und es sind keine übereinstimmenden Daten vorhanden. Ich versuche, auf die Abwesenheit übereinstimmender Daten zu passen, weshalb der Fragetitel COMPOUND SELECT STATEMENT angibt - dh die Praxis, zwei sehr getrennte SELECT-Anweisungen mit sehr separaten where-Klauseln und ohne übereinstimmende Informationen in 1 einzelne Anweisung hinzuzufügen. – Bruce

+0

Haben Sie das Ergebnis überprüft? beide geben Sie nur 2 3 4 und nicht mehr als 1 oder 5 – robert

0

Nutzungsbedingung in Abschnitt on

Versuchen Sie, diese

SELECT table1.id 
FROM table1 
INNER JOIN table2 
ON table1.id = table2.requestID and table2.username = 'user 1' 
WHERE table1.username <> 'user 1' 
+0

Das Problem an diesem Punkt ist, ich weiß nicht, wie ich die Frage stellen soll.Ich glaube eigentlich nicht, dass ein innerer Join die Antwort ist, wie ursprünglich in der Frage angegeben - da ein innerer Join die Daten nicht gegen die Rückgabe der Daten abgleichen kann. Ich benötige alle Resultate, die von table1 zurückgegeben werden, wo der Benutzername nicht der gegenwärtige Benutzer ist UND ich diese Rücksendungen mit table2 zusammenbringen muß, um sicherzustellen, daß der Benutzer sie nicht bereits abgeschlossen hat. – Bruce

+0

der, den er gemacht hat, ist der richtige Weg und es hat keinen Fehler – robert