MySql: выбор по количеству с объединением или объединениями - PullRequest
3 голосов
/ 16 декабря 2011

Мне нужен способ, чтобы модераторы страниц могли просматривать участников своей страницы, упорядоченные по общему количеству сообщений, которые пользователь имеет на этой конкретной странице. Сообщения хранятся в разных таблицах, таких как опросы, загрузки, вики и т. Д. (Например, 15 таблиц). Каждый из них имеет структуру id, user_id, page_id, title, content и т. Д. И т. Д. Таблица, в которой перечислены все пользователи страницы, называется «избранное». Структура этого просто id, user_id, page_id, date.

В настоящее время у меня есть запрос, который объединяет все «таблицы содержимого» для конкретного пользователя, чтобы отобразить ВСЕ свои сообщения по всему сайту, независимо от того, на какой странице он находится, я мог бы легко сделать его специфичным для каждой страницы, используя ГДЕ page_id = $ page_id). Я попытался использовать этот код, чтобы сделать то, что я пытаюсь сделать в области модератора. Как я уже говорил, в области модератора мне нужно отсортировать список пользователей по их общему количеству сообщений DESC.

У меня есть этот код, но он не работает.

$getfans = mysql_query("SELECT DISTINCT user_id, ((SELECT id FROM wiki WHERE wiki.page_id = $page_id AND wiki.user_id = favorites.user_id)
UNION ALL
(SELECT id FROM downloads WHERE downloads.page_id = $page_id AND downloads.user_id = favorites.user_id)
UNION ALL
(SELECT id FROM polls WHERE polls.page_id = $page_id AND polls.user_id = favorites.user_id)) AS posts 
FROM favorites WHERE favorites.page_id = $page_id AND favorites.status = 0 ORDER BY posts DESC", $conn);

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

Пожалуйста, помогите. Благодаря.

Дополнительно ...

Возможно, это был шаг в правильном направлении

$ getfans = mysql_query ("SELECT DISTINCT user_id, (SELECT COUNT (id)") ОТ опросов ГДЕ page_id = $ page_id И user_id = избранное.user_id) КАК ЗАПИСИ ИЗ ЛЮБИМЫХ ГДЕ Favorites.status = 0 ЗАКАЗАТЬ ПО сообщениям DESC, $ conn

Когда я отображал сообщения в $, он дал мне правильное количество для опросов пользователей на этой странице.

ОДНАКО, когда я пытался создать более одной таблицы, возвращался только один пользователь.

1023 * * Пример:

$ getfans = mysql_query ("SELECT DISTINCT user_id, SUM ((SELECT COUNT (id)") ОТ опросов ГДЕ page_id = $ page_id И user_id = Favorites.user_id) + (ВЫБЕРИТЕ COUNT (id) ИЗ Вики ГДЕ page_id = $ page_id AND user_id = избранное.user_id)) КАК ИЗ ЛЮБИМЫХ ГДЕ избранное.page_id = $ page_id И избранное.status = 0 ЗАКАЗАТЬ posts DESC ", $ conn);

Я НАШЕЛ РЕШЕНИЕ
если интересно, просто прочитайте мой пост ниже.

Ответы [ 3 ]

1 голос
/ 17 декабря 2011

Используйте левые объединения!

SELECT 
    f.user_id, 
    COUNT(w.user_id) + COUNT(d.user_id) + COUNT(p.user_id) as PageCount
FROM 
    favorites f
    left join wiki w on
        f.page_id = w.page_id
        and f.user_id = w.user_id
    left join downloads d on
        f.page_id = d.page_id
        and f.user_id = d.user_id
    left join polls p on
        f.page_id = p.page_id
        and f.user_id = p.user_id
WHERE 
    f.page_id = $page_id 
    AND f.status = 0
GROUP BY
    f.user_id
ORDER BY PageCount DESC

Если вы хотите придерживаться подхода объединения:

select
    f.user_id,
    count(x.user_id) as PageCount
from
    favorites f
    inner join (
        select user_id, page_id from wiki
        union all
        select user_id, page_id from downloads
        union all
        select user_id, page_id from polls
        union all
        select user_id, page_id from videos
    ) x on
       f.user_id = x.user_id
       and f.page_id = x.page_id
WHERE 
    f.page_id = $page_id 
    AND f.status = 0
group by
    f.user_id
ORDER BY PageCount DESC

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

1 голос
/ 17 декабря 2011

Я НАШЕЛ РЕШЕНИЕ.Я думал, что у меня было это раньше, но я думаю, я был малейшим.Спасибо всем, кто принял участие.

$getfans = mysql_query("SELECT DISTINCT user_id,
(SELECT COUNT(id) FROM wiki WHERE page_id = $page_id AND user_id = favorites.user_id) + 
(SELECT COUNT(id) FROM downloads WHERE page_id = $page_id AND user_id = favorites.user_id) + 
(SELECT COUNT(id) FROM polls WHERE page_id = $page_id AND user_id = favorites.user_id)  
AS posts FROM favorites
WHERE favorites.page_id = $page_id
AND favorites.status = 0
ORDER BY posts DESC", $conn);

просто продолжайте выполнять подзапрос с + в конце каждой новой таблицы.Возможно, не самый лаконичный код, но он работает.

Это работает.Я не могу принять это как ответ в течение двух дней: (* ​​1006 *

0 голосов
/ 17 декабря 2011

Это мой любимый запрос SQL, для одной таблицы,

Select Distinct user_id, Count(user_id) as C from yourtable group by user_id 

покажет вам user_id каждого человека и количество строк в этой таблице. Объединение этих результатов должно быть простым.

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

...