MySql Select mit Group by

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySql Select mit Group by

    Code:
    SELECT
    	product_id,
    	title
    FROM table_optionen
    	WHERE stock <= 0
    	AND activ = 1
    	GROUP BY product_id, title
    	LIMIT 0, 30;
    Irgendwie stehe ich heute auf dem Schlauch, oben ist meine jetzige Select Anweisung mit dem Ziel alle Artikel listen wo der Lagerbestand für alle Optionen bei 0 oder weniger ist.

    Die DB Struktur sieht ungefähr so aus:
    Code:
    id | product_id | title | subtitle | stock | etc
    1 | 13 | der Artikel | Rot | 0 | etc
    2 | 13 | der Artikel | Blau | 1 | etc
    Das obrige Select greift jetzt natürlich auch bei Einträgen wo nur bei einer Option der Bestand 0 ist. Ziel ist es aber nur dann Treffer zu bringen wenn alle Optionen 0 oder weniger haben. Ist eine Option (z.B. Blau) noch mit positiven Bestand, dann soll der ganze Artikel nicht angezeigt werden.

    Hat jemand eine Idee wie ich das mit einem Query lösen könnte?
    mfg
    marc75

    <Platz für anderes>

  • #2
    Demodaten:

    Code:
    CREATE TABLE IF NOT EXISTS `table_option` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `product_id` int(10) unsigned NOT NULL DEFAULT '0',
      `title` varchar(150) NOT NULL DEFAULT '',
      `sub_title` varchar(150) NOT NULL DEFAULT '',
      `activ` tinyint(1) unsigned NOT NULL DEFAULT '0',
      `stock` int(5) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`),
      KEY `product_id` (`product_id`,`activ`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
    Code:
    INSERT INTO `table_option` (`id`, `product_id`, `title`, `sub_title`, `activ`, `stock`) VALUES
    (1, 13, 'abc T', 'Rot', 1, 0),
    (2, 13, 'abc T', 'Blau', 1, 0),
    (3, 13, 'abc T', 'orange', 1, 0),
    (4, 14, 'def NT', 'Einfach', 1, 0),
    (5, 14, 'def NT', 'Mittel', 1, 1),
    (6, 14, 'def NT', 'Stark', 1, 0),
    (7, 15, 'ghi NT', 'suess', 1, 3),
    (8, 15, 'ghi NT', 'sauer', 1, 2),
    (9, 16, 'bnm NT', 'M', 1, 0),
    (10, 16, 'bnm NT', 'L', 1, 2),
    (11, 16, 'bnm NT', 'XL', 1, -3);
    mfg
    marc75

    <Platz für anderes>

    Kommentar


    • #3
      Nach product_id gruppieren, Summe aller stock-Inhalte bilden, und dann mit HAVING nur die Auswählen, bei denen die Summe > 0 ist - das wäre eine Möglichkeit.


      Btw., Auslesen von produtc_id und title geht hier natürlich nur, wenn nach beiden gruppiert wird (zumindest nach SQL-Standard). Und das wiederum geht nur, weil product_id und title offenbar immer 1:1 zusammengehören. Und das wiederum lässt Zeifel aufkommen, ob vernünftig normalisiert wurde.
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        Zitat von wahsaga Beitrag anzeigen
        Nach product_id gruppieren, Summe aller stock-Inhalte bilden, und dann mit HAVING nur die Auswählen, bei denen die Summe > 0 ist - das wäre eine Möglichkeit.


        Btw., Auslesen von produtc_id und title geht hier natürlich nur, wenn nach beiden gruppiert wird (zumindest nach SQL-Standard). Und das wiederum geht nur, weil product_id und title offenbar immer 1:1 zusammengehören. Und das wiederum lässt Zeifel aufkommen, ob vernünftig normalisiert wurde.
        Das mit den Zweifeln an der Normalisierung ist schon richtig, das Feld title ist in dieser Tabelle eigentlich überflüssig, da es eigentlich aus der Product Tabelle (da wo die product_id auch herkommt) herkommt. Ich hatte das Feld damals eigentlich nur angelegt gehabt um mir ein JOIN zu sparen. Notwendig ist es jedenfalls nicht.

        Die Idee mit der Summe aus dem Stock Inhalt hatte ich auch schon, einzigster Hacken an der Sache sind die negativen Bestände die (leider, optional) Möglich sind.
        mfg
        marc75

        <Platz für anderes>

        Kommentar


        • #5
          Bist Du Piratos? Seitenreport?

          Kommentar


          • #6
            ok, sorry

            Kommentar


            • #7
              @piratos

              danke für den Query und der Erläuterung
              mfg
              marc75

              <Platz für anderes>

              Kommentar

              Lädt...
              X