MySQL двойной COUNT, SELECT и JOIN — как решить проблему?

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

SELECT (
        SELECT COUNT(*)
        FROM news
        WHERE news.author = '$user_name'
        ) AS newscount
    , (
        SELECT COUNT(*)
        FROM torrents
        WHERE torrents.user = '$user_name'
        ) AS torrcount
    , users.DATE AS userdate
    , users.rep AS userrep
    , torrents.title AS tortitle
    , torrents.torrent AS torlink
    , news.link AS newslink
    , news.title AS newstitle
FROM users
LEFT OUTER JOIN torrents ON users.name = torrents.user
LEFT OUTER JOIN news ON users.name= news.author
WHERE users.name = '$user_name'
LIMIT 0, 30;
  • Вопрос задан
  • 4719 просмотров
Решения вопроса 1
SalatProduction
@SalatProduction Автор вопроса
В общем составил два запроса. Может кому пригодится.

$sql->select("(SELECT COUNT(*) c FROM news
		     WHERE news.author = '$user_name') newscount
		     , (SELECT COUNT(*) c
		     FROM torrents
		     WHERE torrents.user = '$user_name')  torrcount
		     ,users.date AS userdate
	             ,users.rep AS userrep
		     ,torrents.title AS Item_Title
		     ,torrents.torrent AS Item_link
		     ,'torrent' AS Item_Type",
		     "users",
		     "INNER JOIN torrents ON users.name = torrents.user
		     WHERE users.name = '$user_name'
		     LIMIT 0, 30");
				
 $sql->select("news.link AS Item_link, 
                      news.title AS Item_Title
		      , 'news' AS Item_Type",
		      "users",
		      "INNER JOIN news ON users.name= news.author
		      WHERE users.name = '$user_name'
		      LIMIT 0, 30");


Или одним запросом, но тогда придется разбивать данные уже с помощью пыха.
SELECT
      @ncount := (
        SELECT COUNT(*) c
        FROM news
        WHERE news.author = '$user_name'
        ) newscount
    , @tcount := (
        SELECT COUNT(*) c
        FROM torrents
        WHERE torrents.user = '$user_name'
        )   torrcount
    , users.DATE AS userdate
    , users.rep AS userrep
    , torrents.title         AS Item_Title
    , torrents.torrent       AS Item_link
    , 'torrent'              AS Item_Type
FROM users
INNER JOIN torrents ON users.name = torrents.user
WHERE users.name = '$user_name'

UNION ALL

SELECT
      @ncount newscount
    , @tcount torrcount
    , users.DATE AS userdate
    , users.rep AS userrep
    , news.link              AS Item_Title
    , news.title             AS Item_link
    , 'news'                 AS Item_Type
FROM users
INNER JOIN news ON users.name= news.author
WHERE users.name = '$user_name'
LIMIT 0, 30
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Lomoson
@Lomoson
Если это ячейка, то она одна. Что значит "в количестве равному циклу первого джоина"? Тем более у вас LIMIT 0, 30;

Или я ничего не вкуриваю, или это порно-запрос...
Ответ написан
Комментировать
@apasen
Может не хватает group by
Ответ написан
alexclear
@alexclear
A cat
А никак не обойти. Группировать либо на сервере, либо на клиенте.
Это очень странный запрос - что именно он достает? Все новости и все торренты пользователя в одной пачке, я так понимаю? Но ведь если пользователь является автором двух торрентов и двух новостей - запрос должен будет достать 4 строки:
"1 новость, 1 торрент",
"1 новость, 2 торрент",
"2 новость, 1 торрент",
"2 новость, 2 торрент",
и это нормально!
Если сгруппировать на сервере по новостям - потеряется информация об одном из торрентов.
Если сгруппировать по торрентам - информация об одной из новостей.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы