2015-03-13 2 views
0

У меня есть следующий:как сортировать и группировать по по его количеству

SELECT DISTINCT s.username, COUNT(v.id) AS cnt 
FROM `instagram_item_viewer` v 
INNER JOIN `instagram_shop_picture` p ON v.item_id = p.id 
INNER JOIN `instagram_shop` s ON p.shop_id = s.id 
AND s.expirydate IS NULL 
AND s.isLocked =0 
AND v.created >= '2014-08-01' 
GROUP BY (
s.id 
) 
ORDER BY cnt DESC 

В принципе у меня есть instagram_item_viewer со следующей структурой:

id viewer_id item_id created 

Он отслеживает, когда пользователь просмотрел элемент и в какое время. Поэтому в основном я хотел найти магазины, у которых больше всего просматриваемых предметов. Я попытался выполнить запрос выше, и он выполнил штраф, однако он, похоже, не дает соответствующих данных, он должен иметь больше счет, чем он есть. Что я делаю не так?

+1

DISTINCT в этом запросе ничего не делает, но сам запрос кажется прекрасным, можете ли вы предоставить некоторые примеры данных и желаемый результат? – piotrm

ответ

1

Во-первых, с заявлением группы, вам не нужно предложение DISTINCT. Группировка заботится о том, чтобы сделать ваши записи отчетливыми.

Возможно, вы захотите пересмотреть порядок своих таблиц. Так как вас интересуют магазины, начните там.

Select s.username, count(v.id) 
From instagram_shop s 
    INNER JOIN instagram_shop_picture p ON p.shop_id = s.shop_id 
INNER JOIN instagram_item_viewer v ON v.item_id = p.id 
    AND v.created >= '2014-08-01' 
WHERE s.expirydate IS NULL 
    AND s.isLocked = 0 
GROUP BY s.username 

Дайте это выстрел.

+0

Я попробовал, и он дает мне тот же результат – adit

+0

предоставляет образцы данных и ожидаемый результат, очень сложно угадать, что вы считаете соответствующими данными – Lennart

0

Как уже упоминалось, @Lennart, если у вас есть образцы данных, было бы полезно. Потому что иначе будут предположения.

Попробуйте запустить это для отладки (это не ответ еще)

SELECT s.username, p.id, COUNT(v.id) AS cnt 
FROM `instagram_item_viewer` v 
INNER JOIN `instagram_shop_picture` p ON v.item_id = p.id 
INNER JOIN `instagram_shop` s ON p.shop_id = s.id 
    AND s.expirydate IS NULL 
    AND s.isLocked =0 
    AND v.created >= '2014-08-01' 
GROUP BY (
    s.username, p.id 
) 
ORDER BY cnt DESC 

Проблема здесь в магазин и пункт зритель слишком далеко друг от друга (т.е. мостиками через shop_picture). Таким образом, shop_picture должен находиться в инструкции SELECT.

Ваш исходный запрос получает только первый подсчет shop_picture для этого магазина, поэтому он меньше, чем ожидалось

В конце концов, если вы все еще хотите, чтобы достичь своей цели, вы можете расширить свой SQL выше

SELECT x.username, SUM(x.cnt) -- or COUNT(x.cnt) depending on what you want 
FROM 
    (
    SELECT s.username, p.id, COUNT(v.id) AS cnt 
    FROM `instagram_item_viewer` v 
    INNER JOIN `instagram_shop_picture` p ON v.item_id = p.id 
    INNER JOIN `instagram_shop` s ON p.shop_id = s.id 
     AND s.expirydate IS NULL 
     AND s.isLocked =0 
     AND v.created >= '2014-08-01' 
    GROUP BY (
     s.username, p.id 
    ) 
    ORDER BY cnt DESC 
) x 
GROUP BY x.username 
Смежные вопросы