tutorials.de Buch-Aktion 02/2012
Like Tree1Danke
  • 1 Beitrag von Matthias Reitinger
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
263
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Nanaki
    Nanaki Nanaki ist offline Mitglied Brokat
    Registriert seit
    Mar 2002
    Beiträge
    372
    Hallo zusammen,

    ich habe folgende MySQL-Tabelle:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    | 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:
    Code sql:
    1
    
    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:
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    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);
    Geändert von Nanaki (15.08.10 um 17:24 Uhr)
     

  2. #2
    Avatar von Alex_T
    Alex_T Alex_T ist offline Mitglied Brokat
    Registriert seit
    Jul 2009
    Beiträge
    305
    Ich verstehe die Frage hier ehrlich gesagt nicht ganz:
    Du hast dir doch schon eine Lösung mit

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

    überlegt, die doch einwandfrei funktioniert.
     
    Mfg, Alex

    “The function of good software is to make the complex appear to be simple.” (Grady Booch)
    “First, solve the problem. Then, write the code.” (John Johnson)

  3. #3
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.774
    Blog-Einträge
    5
    Zitat Zitat von Nanaki Beitrag anzeigen
    Hallo zusammen,

    ich habe folgende MySQL-Tabelle:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    | 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?
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  4. #4
    Avatar von Alex_T
    Alex_T Alex_T ist offline Mitglied Brokat
    Registriert seit
    Jul 2009
    Beiträge
    305
    Und wieso die userId 3 nicht?
    ..., weil es da ja eine Zeile gibt, in der die categoryId 1 ist und das soll nicht sein
     
    Mfg, Alex

    “The function of good software is to make the complex appear to be simple.” (Grady Booch)
    “First, solve the problem. Then, write the code.” (John Johnson)

  5. #5
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.774
    Blog-Einträge
    5
    Zitat Zitat von Alex_T Beitrag anzeigen
    ..., 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):
    Code sql:
    1
    2
    3
    4
    
    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
    Nanaki bedankt sich. 
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  6. #6
    Avatar von Nanaki
    Nanaki Nanaki ist offline Mitglied Brokat
    Registriert seit
    Mar 2002
    Beiträge
    372
    Zitat Zitat von Alex_T Beitrag anzeigen
    Ich verstehe die Frage hier ehrlich gesagt nicht ganz:
    Du hast dir doch schon eine Lösung mit

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

    überlegt, die doch einwandfrei funktioniert.
    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
    Geändert von Nanaki (15.08.10 um 17:38 Uhr)
     

Ähnliche Themen

  1. XSLT - Datensätze kombinieren
    Von mtk-flo im Forum XML Technologien
    Antworten: 2
    Letzter Beitrag: 10.06.07, 12:23
  2. Mysql Count und Update kombinieren
    Von Hannibal im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 08.06.07, 18:04
  3. PHP Mysql Datensätze aus db holen...
    Von CyberMax im Forum PHP
    Antworten: 4
    Letzter Beitrag: 19.04.04, 14:17
  4. MySQL mit Standalone Applikation kombinieren
    Von crimbler im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 26.06.03, 14:58
  5. MySQL: maximale Datensätze
    Von deepgreen im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 09.01.03, 20:05