mysql count UNION результаты, которые не перекрываются - PullRequest
0 голосов
/ 27 декабря 2011

Хорошо, у меня есть запрос

(SELECT * FROM jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) ORDER BY ups DESC,downs ASC)
UNION
(SELECT * FROM jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) ORDER BY ups DESC,downs ASC)
UNION
(SELECT * FROM jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) ORDER BY ups DESC,downs ASC)
 LIMIT 0, 30

, и я буду запускать то же самое, используя COUNT(*) без ограничений

(SELECT COUNT(*) FROM jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) ORDER BY ups DESC,downs ASC)
UNION
(SELECT COUNT(*) FROM jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) ORDER BY ups DESC,downs ASC)
UNION
(SELECT COUNT(*) FROM jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) ORDER BY ups DESC,downs ASC)

По сути, я хотел бы получить общее количество результатов (без ограничения), а также получить ограниченный список.

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

Есть идеи, как очистить весь этот процесс?

Также обратите внимание, что число операторов select изменяется динамически, но я надеялся, что есть способ получить общее количество, учитывающее дубликаты.

Спасибо.

1 Ответ

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

Как насчет этого для Count:

SELECT COUNT(DISTINCT Id)
FROM (SELECT Id From jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) 
      UNION
      SELECT Id From jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?) 
      UNION
      SELECT Id From jokes WHERE flags < 5 AND (title LIKE ? OR joke LIKE ?)) t

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

...