[MySQL] Datensätze kombinieren

Nanaki

Erfahrenes Mitglied
Hallo zusammen,

ich habe folgende MySQL-Tabelle:
Code:
| userId | categoryId |
|      1 |          1 |
|      1 |          2 |
|      1 |          3 |
|      1 |          4 |
|      2 |          2 |
|      2 |          3 |
|      3 |          1 |
|      3 |          3 |
|      4 |          2 |
|      4 |          3 |
|      4 |          4 |

Von dieser Tabelle möchte ich nun sämtliche userId´s auswählen, welche nicht die categoryId 1 und 3 besitzen. Sprich, als Ausgabe sollte in diesem Fall nur die userId 2 und 4 ausgegeben werden.

Meine bisherigen Versuche die Anzahl der Datensätze mit und ohne der categoryId 1 und 3 zu vergleichen, waren bisher leider erfolglos. Gibt es keine Möglichkeit die Datensätze zu kombinieren und dann über die WHERE-Bedingung die ungewünschten Kategorien auszublenden?

In etwa wie in diesem Beispiel:
SQL:
SELECT userId FROM test WHERE categoryId NOT IN(1,3) GROUP BY userId

Ich bin für jeden Tipp dankbar. Falls ihr selbst etwas herumprobieren wollt, hier ist meine Test-Tabelle:
SQL:
CREATE TABLE IF NOT EXISTS `test` (
  `userId` int(11) NOT NULL,
  `categoryId` int(11) NOT NULL,
  KEY `userId` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;


INSERT INTO `test` (`userId`, `categoryId`) VALUES
(1, 1),
(1, 2),
(1, 3),
(1, 4),
(2, 2),
(2, 3),
(3, 1),
(3, 3),
(4, 2),
(4, 3),
(4, 4);
 
Zuletzt bearbeitet von einem Moderator:
Ich verstehe die Frage hier ehrlich gesagt nicht ganz:
Du hast dir doch schon eine Lösung mit

Code:
SELECT userId FROM test WHERE categoryId NOT IN(1,3) GROUP BY userId

überlegt, die doch einwandfrei funktioniert.
:confused::confused:
 
Hallo zusammen,

ich habe folgende MySQL-Tabelle:
Code:
| userId | categoryId |
|      1 |          1 |
|      1 |          2 |
|      1 |          3 |
|      1 |          4 |
|      2 |          2 |
|      2 |          3 |
|      3 |          1 |
|      3 |          4 |
|      4 |          2 |
|      4 |          3 |
|      4 |          4 |

Von dieser Tabelle möchte ich nun sämtliche userId´s auswählen, welche nicht die categoryId 1 und 3 besitzen. Sprich, als Ausgabe sollte in diesem Fall nur die userId 2 und 4 ausgegeben werden.
Und wieso die userId 3 nicht?
 
..., weil es da ja eine Zeile gibt, in der die categoryId 1 ist und das soll nicht sein ;)
Nach der Logik dürften aber 2 und 4 auch nicht im Ergebnis auftauchen, da es für beide eine Zeile mit categoryId 3 gibt. Ich denke Nanaki will all die userIds ausschließen, für die es sowohl eine Zeile mit categoryId 1 als auch eine Zeile mit categoryId 3 gibt. Mir ist auch gerade aufgefallen, dass die Zeile 3 | 4 wohl lediglich einen Tippfehler enthält. Sie taucht weiter unten im Insert-Statement nicht auf, an deren Stelle tritt stattdessen 3 | 3. So ergibt das ganze auch wieder einen Sinn.

In dem Fall könnte Folgendes klappen (ungetestet):
SQL:
SELECT userId
FROM test
GROUP BY userId
HAVING SUM(categoryId IN (1, 3)) < 2
Funktioniert aber nur unter der Voraussetzung, dass es in der Tabelle keine Zeile doppelt gibt (was man ggf. durch ein entsprechendes Constraint garantieren kann).

Grüße,
Matthias
 
Ich verstehe die Frage hier ehrlich gesagt nicht ganz:
Du hast dir doch schon eine Lösung mit

Code:
SELECT userId FROM test WHERE categoryId NOT IN(1,3) GROUP BY userId

überlegt, die doch einwandfrei funktioniert.
:confused::confused:

Damit werden userId 1-4 ausgegeben, weil jede userId mehrere Datensätze besitzt. Somit ist die Bedingung, dass categoryId 1 und 3 ignoriert werden sollen, hinfällig.

Zwar werden mit der Abfrage die Datensätze ignoriert, welche die categoryId 1 und 3 besitzen, aber nicht in Bezug auf die userId. Ich möchte, dass die userId gebündelt betrachtet wird. Sobald eine userId die categoryId 1 und 3 besitzt, soll die userId nicht angezeigt werden.

Schonmal danke für eure Mühe ;)

/edit
@ Matthias Reitinger
Danke für den Hinweis des Tippfehlers. Das sollte natürlich die categoryId 3 sein.
Sorry :(

/edit2
Vielen Dank für die Lösung, das Ganze funktioniert einwandfrei :)
 
Zuletzt bearbeitet:
Zurück