2016-03-30 10 views
1

Ich habe 2 Tabellen;Wählen Sie die Ergebnisse aus Tabelle1 basierend auf den Einträgen in Tabelle2

banner_views (id, b_id, b_date) - dieser Datensatz ein Banner Ansicht jedes Mal

banners_dynamic (id, status, static_iname, static_keywords, static_url, static_alt, static_type, static_image, b_views, b_clicks)

angezeigt wird - speichert die Banner Daten

Ich mag würde 3 banners_dynamic Ergebnisse auszuwählen, die die am wenigsten Ansichten in den letzten 7 Tagen gehabt haben.

Ich habe etwas zusammengefügt (siehe unten), aber ich erkannte, dass es die Gesamtansichten für alle Banner und nicht nur für ID.

SELECT *, 
(SELECT COUNT(*) FROM banner_views v WHERE v.b_date >= DATE(NOW()) - INTERVAL 7 DAY) as post_count 
FROM banners_dynamic b 
WHERE static_keywords LIKE '%test%' AND b.status='1' AND b.static_type='1' 
ORDER BY post_count ASC LIMIT 3 

Kann mir jemand in die richtige Richtung zeigen?

+0

Ist b_id in banner_views die ID auf banners_dynamic? Ich sehe nicht, wie sie verwandt sind. –

Antwort

0

Sie müssen sowohl banners_dynamic Tabelle und Ihre Unterabfrage mit entsprechenden Banner IDs verbinden:

SELECT 
    b.*, p.b_count 
FROM 
    banners_dynamic b 
    INNER JOIN (
     SELECT 
      b_id, 
      COUNT(*) AS b_count 
     FROM 
      banner_views v 
     WHERE 
      v.b_date >= DATE(NOW() - INTERVAL 7 DAY) 
     GROUP BY 
      b_id 
    ) p on p.b_id = b.id 
WHERE 
    b.static_keywords LIKE '%test%' 
    AND b.`status` = '1' 
    AND b.static_type = '1' 
ORDER BY 
    p.b_count ASC 
LIMIT 3 

UPDATE: Sie können es auch ohne Unterabfrage:

SELECT 
    b.*, COUNT(v.b_id) AS b_count 
FROM 
    banners_dynamic b 
    INNER JOIN banner_views v ON v.b_id = b.id 
WHERE 
    v.b_date >= DATE_ADD(NOW(), INTERVAL - 7 DAY) 
    AND b.static_keywords LIKE '%test%' 
    AND b.`status` = '1' 
    AND b.static_type = '1' 
GROUP BY 
    v.b_id 
ORDER BY 
    b_count ASC 
LIMIT 3; 

Wenn Sie Banner aufnehmen möchten Ohne Ansichten (Anzahl = 0) müssen Sie dann eine LEFT JOIN:

SELECT 
    b.*, COUNT(v.b_id) AS b_count 
FROM 
    banners_dynamic b 
    LEFT JOIN banner_views v ON v.b_id = b.id 
       AND v.b_date >= DATE_ADD(NOW(), INTERVAL - 7 DAY) 
WHERE 
    b.static_keywords LIKE '%test%' 
    AND b.`status` = '1' 
    AND b.static_type = '1' 
GROUP BY 
    v.b_id 
ORDER BY 
    b_count ASC 
LIMIT 3; 
tun
+0

Danke mitkosoft - funktioniert perfekt und ist für das nächste Mal einfach zu verstehen (Ich habe die 3. Option verwendet, da ich Nullen haben werde, wenn neue Banner hinzugefügt werden). –

+0

Großartig! Markieren Sie die Antwort in diesem Fall, um das Thema zu schließen. – mitkosoft

Verwandte Themen