2016-06-16 14 views
-1

Wie Sie auf dieser sqlfiddle sehen können, ich habe dieses Schema:MySQL LEFT JOIN mit Gruppierung und Datum

CREATE TABLE reviews 
    (`id` int(11) NOT NULL AUTO_INCREMENT, 
    `shop_id` int(11), 
    `order_id` char(255), 
    `product_id` char(32), 
    `review_time` int(11), 
    PRIMARY KEY (`id`) 
    ) 
; 
INSERT INTO reviews 
    (`shop_id`, `order_id`, `product_id`, `review_time`) 
VALUES 
    ('10', '100', '1000', '1466190000'), 
    ('10', '100', '1000', '1466276400'), 
    ('10', '100', '1000', '1466462800'), 
    ('20', '800', '8000', '1466249200') 
; 

CREATE TABLE tags 
    (`id` int(11) NOT NULL AUTO_INCREMENT, 
    `shop_id` int(11), 
    `order_id` char(255), 
    `product_id` char(32), 
    `tag_time` INT(11) NULL, 
    PRIMARY KEY (`id`) 
    ) 
; 
INSERT INTO tags 
    (`shop_id`, `order_id`, `product_id`, `tag_time`) 
VALUES 
    ('10', '100', '1000', '1466449200'), 
    ('10', '100', '1000', NULL), 
    ('10', '100', '3000', NULL), 
    ('20', '800', '8000', '1469449200') 
; 

Ich brauche Statistiken Datum zu erhalten, die zeigen, wie viele Bewertungen, die ich pro Tag haben und wie viele wurden getaggt und wie viele nicht. Ich bin mit dieser Abfrage:

SELECT 
    DATE_FORMAT(FROM_UNIXTIME(r.`review_time`), "%d.%m.%Y") AS review_submited_on, 
    r.`shop_id`, 
    COUNT(*) as total_orders, 
    COUNT(*) as tagged_orders 
FROM 
    reviews AS r 
LEFT JOIN tags as t 
    ON r.`shop_id` = t.`shop_id` AND 
    r.`order_id` = t.`order_id` AND 
    r.`product_id` = t.`product_id` 
WHERE 
    t.`tag_time` IS NOT NULL  
GROUP BY r.`shop_id`, r.`order_id`, r.`product_id` 
ORDER BY review_submited_on ASC 

UPDATE Das erwartete Ergebnis würde wie folgt aussehen:

| review_submited_on | shop_id | total_orders | tagged_orders | 
|--------------------|---------|--------------|---------------| 
|   17.06.2016 |  10 |   3 |    1 | 
|   18.06.2016 |  20 |   1 |    1 | 

Ich habe diese sqlfiddle für Demo. Danke für jede Hilfe :)

+3

Was würde das gewünschte Ergebnis aussehen? (Warum stellt niemand dies jemals zur Verfügung?) – Strawberry

+1

Sie möchten Bewertungen und Tags für jeden Shop, Bestellung, Produkt oder alle drei kombiniert aggregieren? – Tin

+0

@Tin Ich möchte sehen, wie viele Bewertungen von den gesamten vorhandenen Bewertungen getaggt wurden. Bitte sehen Sie in der Tabelle nach, wie das Ergebnis aussehen soll. Danke – numediaweb

Antwort

0

Versuchen Sie dies, und lassen Sie mich wissen, wenn das etwas ist, was Sie wollen.

SELECT review_submited_on, shop_id, total_orders, IFNULL(tagged_orders, 0) tagged_orders 
FROM 
    (SELECT shop_id, COUNT(DISTINCT shop_id, order_id, product_id) total_orders, DATE_FORMAT(FROM_UNIXTIME(review_time), "%d.%m.%Y") AS review_submited_on 
    FROM reviews 
    GROUP BY shop_id) review_counter 
    LEFT JOIN 
    (SELECT shop_id, COUNT(DISTINCT shop_id, order_id, product_id) tagged_orders 
    FROM tags 
    WHERE tag_time IS NOT NULL 
    GROUP BY shop_id) tag_counter 
USING (shop_id) 

Ergebnis

| review_submited_on | shop_id | total_orders | tagged_orders | 
|--------------------|---------|--------------|---------------| 
|   17.06.2016 |  10 |   1 |    1 | 
|   18.06.2016 |  20 |   1 |    1 |