3 Stimmen

Problem bei der Verwendung von MySQL Joins

Ich bin ziemlich neu in MySQL und habe keine Ahnung, ob ich in die richtige Richtung gehe, aber ich habe Schwierigkeiten mit einer MySQL-Abfrage.

Ich habe im Grunde genommen eine Tabelle von Benutzern

id      name  
----    -------- 
1       user1          
2       user2          
3       user3          
4       user4

sowie eine Tabelle von Benutzerattributen

id      userid   attribute 
----    -----    ------ 
1       1        5          
2       1        6       
3       2        5          
4       3        4

Ich möchte Benutzer auswählen, die sowohl das Attribut 5 als auch das Attribut 6 haben, also möchte ich in diesem Fall zurückgeben

id      name  
----    -------- 
1       user1  

Ich habe versucht, einen Join wie folgt zu verwenden.

SELECT u.id, u.name FROM users u LEFT JOIN attributes a ON (a.userid = u.id) WHERE a.attribute = 5 AND a.attribute = 6

Aber offensichtlich funktioniert das nicht, wie könnte man das am besten lösen?

4voto

Chris Shaffer Punkte 31499

Ein Weg, dies zu tun, wäre, zwei Joins zu verwenden; z.B.:

SELECT ...
FROM users u
    JOIN attributes a5 ON u.id = a5.userid AND a5.attribute = 5
    JOIN attributes a6 ON u.id = a6.userid AND a6.attribute = 6

Ein anderer Weg ist durch Gruppierung (beachten Sie, dass ich ein MS SQL-Person bin, nicht sicher, ob dies die richtige Syntax für MySQL ist oder nicht):

SELECT u.id, u.name
FROM users u
    JOIN attributes a ON u.id = a.userid
WHERE a.attribute IN (5,6)
GROUP BY u.id, u.name
HAVING COUNT(*) = 2

0voto

Zarigani Punkte 835
SELECT u.id, u.name FROM users u
  INNER JOIN attributes a1 ON u.id = a1.userid
  INNER JOIN attributes a2 ON u.id = a2.userid
WHERE a1.attribute = 5 AND a2.attribute = 6

0voto

Frankie Punkte 23889

Das Ändern der Abfrage auf diese Weise würde funktionieren:

Wählen Sie alles aus der Attributetabelle aus, das 5 oder 6 entspricht, und überprüfen Sie dann die Benutzer, die übereinstimmen.

SELECT a.id, u.name
FROM attributes AS a
LEFT JOIN users AS u ON a.id = u.id
WHERE a.attribute = 5 OR a.attribute = 6

0voto

Dolph Punkte 47410

Basierend auf Ihrer Frage halte ich die anderen beiden aktuellen Antworten nicht für zufriedenstellend.

Wenn Sie möchten:

Benutzer auswählen, die sowohl das Attribut 5 als auch das Attribut 6 haben

Die folgende Abfrage ist eine Möglichkeit, dies zu erreichen:

select
  *
from
  users
where
  id in (select userid from attributes where attribute = 5)
  and
  id in (select userid from attributes where attribute = 6)

0voto

Gabriel Ščerbák Punkte 17544

Hmm, ich bin nicht so sehr in SQL, vielleicht helfen dir GROUP BY und HAVING:) Schau dir die Referenz an: http://www.w3schools.com/sql/sql_having.asp

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X