2015-07-26 2 views
2

У меня есть 3 стола. Мне нужно выводить результаты из всех трех, но группировать их по дате и показывать количество записей в день.Одиночные или несколько запросов

Таблицы:

business_actions 
---------------- 
id 
article_id 
business_id 
action 


articles 
---------------- 
id 
user_id 
item 
date 
time 

users 
------------------ 
id 
name 
role 

Я не уверен, если я должен попытаться получить все это в одном запросе выполнить запрос, где я буду получать различные даты и общее число записей, а затем запустить дополнительные запросы для получения дополнительной информации? ..

Я начал с этого, но не зашел слишком далеко.

SELECT 
     COUNT(business_actions.id) AS cnt, 
     business_actions.action, 
     articles.user_id, 
     articles.item, 
     articles.date, 
     articles.time, 
     users.* 
FROM business_actions 
LEFT JOIN articles ON (business_actions.article_id = articles.id) 
LEFT JOIN users ON (articles.user_id = users.id) 
WHERE business_actions.business_id = ".$busID." 
ORDER BY articles.time DESC 
GROUP BY articles.date  
LIMIT 20 

Предел фактически должно быть число дней, а не записи ...

Конечный результат должен выглядеть примерно так:

July 20, 2015 (2) 
    Some item -- 10:00 am 
     Name: John M 
     Role: Admin 
     Action: login 

    Another Item -- 10:30 am 
     Name: Jeff M 
     Role: User 
     Action: publish 

July 18, 2015 (3) 
    Some item -- 2:00 am 
     Name: Bill M 
     Role: User 
     Action: print 

    Another Item -- 10:30 am 
     Name: Bob W 
     Role: Manager 
     Action: exit 

    One more item -- 2:00 pm 
     Name: William N 
     Role: User 
     Action: logout 

UPDATE: Вот Fiddle на основе Ответ Бармара ниже.

ответ

0

Чтобы ограничить количество дней, вам необходимо присоединиться к подзапросу, который получает эти даты.

SELECT 
     cnt, 
     business_actions.action, 
     articles.user_id, 
     articles.item, 
     DATE(articles.date) AS date, 
     articles.time, 
     users.* 
FROM business_actions 
JOIN articles ON business_actions.article_id = articles.id 
JOIN (SELECT DATE(date) AS date, count(*) as cnt 
     FROM articles 
     GROUP BY DATE(date) 
     ORDER BY DATE(date) DESC 
     LIMIT 20) AS dates 
    ON DATE(articles.date) = dates.date 
LEFT JOIN users ON (articles.user_id = users.id) 
WHERE business_actions.business_id = 42 
ORDER BY articles.date DESC, articles.time DESC 

DEMO

+0

Ничего себе, это очень здорово, но я получаю ограниченные результаты возвращаются. Я попробовал это на скрипке здесь: http://sqlfiddle.com/#!9/4817d/1 Я также исправил свою опечатку: articles.res_id должен быть articles.id – santa

+0

Нужно делать подсчет в подзапросе тоже , И в скрипке у вас есть время в столбце 'date', поэтому я должен использовать' DATE (date) ', чтобы объединить их по дате. – Barmar

Смежные вопросы