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
    Ohne Tabellenstruktur und ein paar Demodaten (SQL) ?

    Ich tippe nix ein.

    Kommentar


    • #3
      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


      • #4
        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


        • #5
          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


          • #6
            PHP-Code:
            SELECT *,MAX(stock) as summe
            FROM table_option
            WHERE activ
            =1 group by product_id having summe <
            Erklärung:

            Man holt sich das Maximum und gruppiert sie nach product_id und nimmt davon nur die Datensätze die in der summe kleiner als 1 sind.
            Bingo , man hat nur noch die Datensätze der product_id bei denen kein verfügbarer Bestand in allen Optionen vorhanden ist.
            Zuletzt geändert von ; 04.08.2009, 15:46.

            Kommentar


            • #7
              Bist Du Piratos? Seitenreport?

              Kommentar


              • #8
                Meinst du mich ? Mit einem Seitenreport habe ich nix zu tun.

                Kommentar


                • #9
                  ok, sorry

                  Kommentar


                  • #10
                    @piratos

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

                    <Platz für anderes>

                    Kommentar

                    Lädt...
                    X