Неверный результат COUNT при SELECT с JOIN обьяденными UNION

fanik

Новичок
Неверный результат COUNT при SELECT с JOIN обьяденными UNION

Постановка задачи:

Имеется основная таблица ARTICLES_TABLE, к ней присоединяется с помощью LEFT JOIN таблица ARTICLES_COMMENTS_TABLE из которой мне необходимо узнать кол-во элементов которые удовлетворяют условию заданном в LEFT JOIN .
Данные запрос объединяется еще с одним с помощью UNION ( что и есть причиной проблемы )


Код:
('
			(SELECT
				t1.name, t1.subname, t1.kiker, t1.url, t1.stext, t1.mimage, DATE_FORMAT(t1.pdate, \'%y-%m-%d\') AS pdate,
				t2.name AS rubric, t4.lname, t4.fname, t4.mname,
				COUNT(t3.comment_id) AS comments
			FROM
				' . DB_PREFIX . ARTICLES_TABLE . ' AS t1
			JOIN
				' . DB_PREFIX . RUBRICS_TABLE . ' AS t2 ON (t2.rubric_id = t1.rubric_id AND t2.deleted="n" AND t2.access="y")
			JOIN
				' . DB_PREFIX . USERS_TABLE . ' AS t4 ON (t4.user_id = t4.user_id AND t4.hidden="n" AND t4.deleted="n" AND t4.access="y")
			LEFT JOIN
				' . DB_PREFIX . ARTICLES_COMMENTS_TABLE . ' AS t3 ON (t3.article_id = t1.article_id)
			WHERE
				t1.main="y" AND
				t1.access="y" AND
				t1.deleted="n"
			GROUP BY
				t1.article_id
			ORDER BY
				t1.pdate DESC
			LIMIT
				0, 1)
			UNION
			(SELECT
				t1.name, NULL AS subname, t1.kiker, t1.url, t1.stext, NULL AS mimage, DATE_FORMAT(t1.pdate, \'%y-%m-%d\') AS pdate,
				t2.name AS rubric, t4.lname, t4.fname, t4.mname,
				COUNT(t3.comment_id) AS comments
			FROM
				' . DB_PREFIX . ARTICLES_TABLE . ' AS t1
			JOIN
				' . DB_PREFIX . RUBRICS_TABLE . ' AS t2 ON (t2.rubric_id = t1.rubric_id AND t2.deleted="n" AND t2.access="y")
			JOIN
						' . DB_PREFIX . USERS_TABLE . ' AS t4 ON (t4.user_id = t4.user_id AND t4.hidden="n" AND t4.deleted="n" AND t4.access="y")
      LEFT JOIN
				' . DB_PREFIX . ARTICLES_COMMENTS_TABLE . ' AS t3 ON (t3.article_id = t1.article_id)			
      WHERE
				t1.amain="y" AND
				t1.access="y" AND
				t1.deleted="n"
			GROUP BY
				t1.article_id
			ORDER BY
				t1.pdate DESC
			LIMIT
				0, 2)
		')


Результат работы:
скрипт: 54 9 18
реальные данные 6 1 2

Т.е. в таблице ARTICLES_COMMENTS_TABLE существует 6 записей удовлетворяющих условию первого SELECTа LEFT JOIN .... а скрипт выдает 54. Видно что реальный результат от получаемого отличается в 9 раз. при смене кол-ва элементов соотношение меняется.

Искал в и-нете и нашел направление как решить проблему: использование CASE.. но ранее с ним не сталкивался и не смог найти ни одного решения данной проблемы.
Похожая проблема обсуждалась:
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=103278
 

Dl

Новичок
Возьми один select, убери limit и group by и посмотри, что и как выбирается.
 

fanik

Новичок
DL спасибо
убрав UNION я получил тот же результат (54 - неверно), насколько я понимаю это значит что UNION сдесь не при чем.
Убрав лимит ничего не меняется.
Убирая GROUP BY я получаю ошибку.

В чем может быть проблема?
 

Dl

Новичок
В ошибке обычно пишется, из-за чего она произошла.
 

fanik

Новичок
Код:
			SELECT
				t1.name, t1.subname, t1.kiker, t1.url, t1.stext, t1.mimage, DATE_FORMAT(t1.pdate, "%y-%m-%d") AS pdate,
				t2.name AS rubric, t4.lname, t4.fname, t4.mname,
				COUNT(t3.comment_id) AS comments
			FROM
				articles AS t1
			JOIN
				rubrics AS t2 ON (t2.rubric_id = t1.rubric_id AND t2.deleted="n" AND t2.access="y")
			JOIN
				users AS t4 ON (t4.user_id = t4.user_id AND t4.hidden="n" AND t4.deleted="n" AND t4.access="y")
			LEFT JOIN
				articles_comments AS t3 ON (t3.article_id = t1.article_id)
			WHERE
				t1.main="y" AND
				t1.access="y" AND
				t1.deleted="n"
	
			ORDER BY
				t1.pdate DESC
                        LIMIT 0, 1
Ошибка:
#1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
 

Gas

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

fanik

Новичок
Если убрать count, то наверняка будет дублирование 9 раз t3.comment_id.
Код:
 SELECT t1.name, t1.subname, t1.kiker, t1.url, t1.stext, t1.mimage, DATE_FORMAT( t1.pdate, "%y-%m-%d" ) AS pdate, t2.name AS rubric, t4.lname, t4.fname, t4.mname, t3.comment_id AS comments
FROM articles AS t1
JOIN rubrics AS t2 ON ( t2.rubric_id = t1.rubric_id
AND t2.deleted = "n"
AND t2.access = "y" )
JOIN users AS t4 ON ( t4.user_id = t4.user_id
AND t4.hidden = "n"
AND t4.deleted = "n"
AND t4.access = "y" )
LEFT JOIN articles_comments AS t3 ON ( t3.article_id = t1.article_id )
WHERE t1.main = "y"
AND t1.access = "y"
AND t1.deleted = "n"
ORDER BY t1.pdate DESC
LIMIT 0 , 30
Получаю масивв с кол-вом элементов = кол-ву удовлетворяющих запросу джоина ( LEFT JOIN articles_comments AS t3 ON ( t3.article_id = t1.article_id ) ) а comments принимает значение comment_id - этого и стоило ожидать.. добавив к запросуу GROUP получу один comment_id..




Код:
t4.user_id = t4.user_id
убрав это условие ничего не меняется. скрипт изначально писал не я и могу предположить что это заглушка под более сложную логику которая планируется далее.

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

-~{}~ 15.08.08 15:53:

Добавив группировку по t4.user_id
получаю правильный результат и эффекта на юзеров не производит так как user_id - уникальный идентификатор.

Спасибо всем за советы вопрос решен :) Только ошибка оказалась совсем не в том месте где я ожидал
 
Сверху