2017-03-10 3 views
0

ich das folgende Skript bin Ausführung:MySQL - COUNT und MAX in derselben Abfrage. MAX ignoriert WHERE-Klausel

SELECT a.*, 
    gg.image as 'recent_image_file' 
FROM 

( SELECT c.cid, 
      c.category_name AS 'cat_name', 
      COUNT(g.id) AS image_count, 
      c.category_image AS 'images', 
      c.estgendpref, 
      MAX(n.id) as 'recent_image' 
    FROM tbl_category c 
    LEFT JOIN tbl_gallery_category g 
     ON c.cid=g.cat_id 
    LEFT JOIN tbl_gallery n 
     ON n.id=g.image_id 

    WHERE n.date_active < NOW() 
    GROUP BY c.cid 
    ORDER BY c.category_name ASC 
) a 

INNER JOIN tbl_gallery gg 
    ON a.recent_image = gg.id; 

Alles ist in Ordnung, außer der Rückkehr der MAX (n.id) die Klausel WHERE ignoriert und gibt die Top-ID für die Kategorie. Wie bekomme ich die MAX (n.id), um das Maximum für die Ergebnismenge einschließlich der WHERE-Klausel zurückzugeben? Vielen Dank.

+0

Beachten Sie, dass 'WHERE n.date_active

+0

Fügen Sie der Unterabfrage SELECT-Klausel 'MAX (n.date_active) als max_date' hinzu. Gibt es etwas Größeres zurück als 'NOW()'? –

+0

@PaulSpiegel - Danke. Ich tat es und nein, tut es nicht. Es sieht so aus, als ob die Abfrage wie erwartet funktioniert. Mein Fehler. Die Verwendung von MAX (id) war nie ideal. Ich brauche die Abfrage, um die neueste ID basierend auf date_active zurückzugeben. Dies ist jedoch nicht unbedingt die MAX (ID), aber es könnte keine Möglichkeit gefunden werden, das gewünschte Ergebnis zu erzielen. –

Antwort

0

Sie die in dem Zustand, in on-Klausel eine richtige Hinzufügen und .. sonst verwenden sollten, die, wo die Arbeit als innere Joinbedingung

SELECT a.*, 
    gg.image as 'recent_image_file' 
FROM 

( SELECT c.cid, 
      c.category_name AS 'cat_name', 
      COUNT(g.id) AS image_count, 
      c.category_image AS 'images', 
      c.estgendpref, 
      MAX(n.id) as 'recent_image' 
    FROM tbl_category c 
    LEFT JOIN tbl_gallery_category g ON c.cid=g.cat_id 
    LEFT JOIN tbl_gallery n ON n.id=g.image_id and n.date_active < NOW() 
    GROUP BY c.cid 
    ORDER BY c.category_name ASC 
) a 

INNER JOIN tbl_gallery gg 
    ON a.recent_image = gg.id; 
0

So mit Dank an diejenigen, die beraten, fand ich die WHERE-Klausel verwendet wurde . Allerdings war MAX (id) nicht das, was wirklich gewünscht wurde, da eine niedrigere ID ein größeres Datum haben könnte. Das Folgende wirkt charmant.

SELECT c.cid, 
      c.category_name AS 'cat_name', 
      COUNT(g.id) AS image_count, 
      c.category_image AS 'images', 
      c.estgendpref, 
      recent.id as 'recent_image', 
      recent.date_active, 
      recent.image as 'recent_image_file' 
    FROM tbl_category c 
    INNER JOIN tbl_gallery_category g 
     ON c.cid=g.cat_id 
    JOIN (SELECT * FROM tbl_gallery WHERE date_active <= CURDATE() ORDER BY date_active DESC, id DESC) recent 
     ON recent.id = g.image_id 

    GROUP BY c.cid 
    ORDER BY c.category_name ASC