3 Stimmen

MySQL Einzeltabelle, Wert basierend auf mehreren Zeilen auswählen

Wie würde ich aus der nachstehenden Tabelle alle animalIds auswählen, die eine bestimmte Kombination von attributeIds haben? Wenn ich z. B. die attributeIds 455 & 685 eingebe, würde ich erwarten, dass ich die animalIds 55 & 93 zurückbekomme

Name der Tabelle: animalAttributes

id      attributeId     animalId
1       455             55
2       233             55
3       685             55
4       999             89
5       455             89
6       333             93
7       685             93
8       455             93

Ich habe die folgende Abfrage, die zu funktionieren scheint, aber ich bin nicht sicher, ob es eine robustere Weise?

  SELECT animalId
    FROM animalAttributes
   WHERE attributeId IN (455,685)
GROUP BY animalId 
  HAVING COUNT(DISTINCT attributeId) = 2;

1voto

bpgergo Punkte 15135
SELECT DISTINCT animalId
FROM animalAttributes
WHERE attributeId IN (455,685)

oder

SELECT animalId
FROM animalAttributes
WHERE attributeId IN (455,685)
GROUP BY animalId

1voto

Fosco Punkte 37355

Wenn Sie wirklich genaue Ergebnisse wünschen, können Sie eine narrensichere Methode wie die folgende anwenden:

select distinct base.animalId
from animalAttributes base
join animalAttributes a on base.animalId = a.animalId
     and a.attributeId = 455
where base.attributeId = 685

Wenn Sie später 3 übereinstimmende Attribute benötigen, können Sie einfach eine weitere Verknüpfung hinzufügen:

select distinct base.animalId
from animalAttributes base
join animalAttributes a on base.animalId = a.animalId
     and a.attributeId = 455
join animalAttributes b on base.animalId = b.animalId
     and b.attributeId = 999
where base.attributeId = 685

1voto

Halcyon Punkte 55829
SELECT DISTINCT `animalId` FROM `animalAttributes` WHERE `attributeId` = 455
INTERSECT
SELECT DISTINCT `animalId` FROM `animalAttributes` WHERE `attributeId` = 685

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