2013-04-28 3 views
1

Мне нужно подсчитать количество строк в track_plays, которые имеют определенный track_ID, и присоединиться к этому с помощью моего запроса, который выбирает большое количество данных из разных таблиц.SQL - левое соединение SELECT с SELECT COUNT (*)

Вот что я до сих пор;

SELECT 
    T.ID, 
    T.url, 
    T.name, 
    T.pic, 
    T.T_ID, 

    COUNT(P.T_ID) AS plays, 
    S.Status, 

    G.gig_name, 
    G.date_time, 
    G.lineup, 
    G.price, 
    G.ticket, 

    E.action, 
    E.ID, 
    E.timestamp, 
    E.E_ID 

FROM 
    events E 
    LEFT JOIN 
    TRACKS T 
    ON T.ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = T.T_ID 

    LEFT JOIN 
    STATUS S 
    ON S.ID = E.ID AND E.action = 'has some news.' AND E.E_ID = S.S_ID 

    LEFT JOIN 
    GIGS G 
    ON G.ID = E.ID AND E.action = 'has posted a gig.' AND E.E_ID = G.G_ID 

    LEFT JOIN 
    track_plays P 
    ON P.A_ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = P.T_ID 

WHERE E.ID = '3' 
ORDER BY E.timestamp DESC LIMIT 15 

Hopeflly, которые должны объяснить, что я пытаюсь сделать быстрее, чем слова может, но в основном в plays подсчитывает количество пьес была трек. Events - это таблица, в которой все новые идентификаторы отправляются на любой новый контент. Им дается действие, чтобы мы могли определить, какое событие они есть, и, следовательно, извлекать данные из правильной таблицы (таблиц).

На данный момент, с COUNT там запроса дает что-то вроде этого

ID name pic T_ID plays ... 

3 1  2 44 100 

данные я поставил там только представитель, и это дает больше столбцов, чем это. Дело в том, что это должно дать что-то подобное;

ID name pic T_ID plays ... 

3 1  2 44 100 

3 3  1 48 10 

4 8  2 21 86 

Как вы можете видеть, с COUNT в нем выдается много данных.

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

Спасибо!

+0

'' 'ГРУППА''' твой друг, я думаю. Итак, E.ID является «ключом» в таблице результатов или я неправильно понял? – luksch

+0

Вот что я не хотел погружаться. По большей части запроса E_ID является «ключом», но в случае подсчета воспроизведения да T_id является «ключом». –

+0

Извините ... я изменил свой комментарий, когда увидел свою ошибку ... – luksch

ответ

1

Выполнено, спасибо всем, кто помог. Мне не хватало оговорку GROUP BY. Теперь это работает как шарм. Вот готовый продукт:

SELECT 
    T.ID, 
    T.url, 
    T.name, 
    T.pic, 
    T.T_ID, 

    COUNT(P.T_ID) AS plays, 
    S.Status, 

    G.gig_name, 
    G.date_time, 
    G.lineup, 
    G.price, 
    G.ticket, 

    E.action, 
    E.ID, 
    E.timestamp, 
    E.E_ID 

FROM 
    events E 
    LEFT JOIN TRACKS T 
     ON T.ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = T.T_ID 
    LEFT JOIN STATUS S 
     ON S.ID = E.ID AND E.action = 'has some news.' AND E.E_ID = S.S_ID 
    LEFT JOIN GIGS G 
     ON G.ID = E.ID AND E.action = 'has posted a gig.' AND E.E_ID = G.G_ID 
    LEFT JOIN track_plays P 
     ON P.A_ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = P.T_ID 
WHERE E.ID = '3' 
GROUP BY T.T_ID 
ORDER BY E.timestamp DESC LIMIT 15 
2

см. this question, поскольку вам нужна явная группа. Я думаю, вам нужно добавить это в ваш запрос:

... 
GROUP BY P.T_ID 
+0

Я посмотрю, спасибо. –

+0

Так что я не уверен, как это использовать. Хочу ли я GROUP BY в LEFT JOIN или я хочу его после него? –