fanik
Новичок
Неверный результат COUNT при SELECT с JOIN обьяденными UNION
Постановка задачи:
Имеется основная таблица ARTICLES_TABLE, к ней присоединяется с помощью LEFT JOIN таблица ARTICLES_COMMENTS_TABLE из которой мне необходимо узнать кол-во элементов которые удовлетворяют условию заданном в LEFT JOIN .
Данные запрос объединяется еще с одним с помощью UNION ( что и есть причиной проблемы )
Результат работы:
скрипт: 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
Постановка задачи:
Имеется основная таблица 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