2017-01-13 3 views
0

Ich versuche, alle Daten aus meiner Tabelle "Ereignisse" auszuwählen, wenn die "Ereignis-ID" mit der "Benutzer-ID" übereinstimmt. Allerdings bekomme ich einen Fehler 1242 Unterabfrage gibt mehr als 1 Zeile zurück.MySQL-Unterabfragefehler: Unterabfrage gibt mehr als 1 Zeile zurück

$query = "SELECT * FROM events WHERE id = (SELECT event_id FROM booking_dates WHERE user_id = '{$user_id}')"; 
$event_set = mysqli_query($connection, $query); 

Ich verstehe, dass meine Unterabfrage mehrere Zeilen zurückgibt, weil ein Benutzer mehrere Ereignisse besuchen kann. Wie kann ich also meine Abfrage mehrere Zeilen akzeptieren lassen?

+0

Können Sie uns die Struktur booking_dates und events anzeigen lassen, oder zumindest ihre Verknüpfungen (falls vorhanden). Sie müssen mit einem INNEREN JOIN lösen: http://dev.mysql.com/doc/refman/5.7/en/join.html –

+0

** WARNUNG **: Wenn Sie mysqli verwenden, sollten Sie [parametrisierte Abfragen verwenden ] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) und ['bind_param'] (http://php.net/manual/en/mysqli-stmt.bind-param .php), um Benutzerdaten zu Ihrer Abfrage hinzuzufügen. ** Verwenden Sie NICHT ** String-Interpolation oder Verkettung, um dies zu erreichen, weil Sie einen schwerwiegenden [SQL injection bug] erstellt haben (http://bobby-tables.com/). ** NIEMALS ** $ _POST 'oder' $ _GET' Daten direkt in eine Abfrage einfügen, es kann sehr schädlich sein, wenn jemand versucht, Ihren Fehler auszunutzen. – tadman

Antwort

1

könnten Sie in verwenden:

SELECT * FROM events 
WHERE id IN (SELECT event_id FROM booking_dates WHERE user_id = '{$user_id}') 

Warnung: Injizieren Zeichenketten wie diese in Ihrer SQL macht sie zu SQL-Injection verwundbar. Bitte schauen Sie in prepared statements, auf die Sie bind arguments ohne diese Sicherheitsanfälligkeit können.

0

Sie Abfrage sollte IN-Operator mit wo verwenden.

$query = "SELECT * FROM events WHERE id IN (SELECT event_id FROM booking_dates WHERE user_id = '{$user_id}')"; 
$event_set = mysqli_query($connection, $query); 

http://www.w3schools.com/sql/sql_in.asp

0

Ich bin kein SQL-Experte und als solche meine Syntax ein wenig aus sein kann. Ich glaube jedoch, was Sie suchen ist eine IN Klausel:

$query = "SELECT * FROM events WHERE id IN (SELECT event_id FROM booking_dates WHERE user_id = '{$user_id}')"; 
$event_set = mysqli_query($connection, $query); 
0

Andere haben gezeigt, wie Sie Ihre Syntax zu korrigieren. Im Allgemeinen funktioniert MySQL jedoch besser, wenn Sie JOIN anstatt WHERE column IN (subquery) verwenden.

SELECT DISTINCT e.* 
FROM events AS e 
JOIN booking_dates AS b ON e.id = b.event_id 
WHERE b.user_id = '$user_id' 
0

"Also wie kann ich meine Abfrage akzeptieren mehrere Zeilen?"

VERWENDEN Sie eine Auswahl, die einen rechten Join zur Tabelle booking_dates aufweist. Der Grund für den RECHTEN JOIN besteht darin, dass Sie die Datensätze nur dann in der Ereignistabelle anzeigen möchten, wenn mindestens ein gültiger Buchungsdatumsdatensatz für die Ereignis-ID und den angegebenen Benutzer vorhanden ist. Ich glaube, mehrere Zeilen zu erreichen und nur die Daten anzeigen der Code am Ende wie folgt und wird gleichzeitig:

$query = " 
SELECT 
    * 
FROM 
    events e 
RIGHT JOIN 
    booking_dates bd 
    ON e.id=bd.event_id 
WHERE 
    bd.user_id = '{$user_id}'"; 
$event_set = mysqli_query($connection, $query); 

Wie oben auch Best Practice empfohlen, Ihre SQL-Abfragen werden „gereinigt“ mit Hilfe von Parametern stellen Sie sicher und verbindlich. Dieser Stack-Überlauf-Link bietet die Antwort. parameters in MySQLi

Verwandte Themen