$query = "SELECT posts.* FROM map, posts, tags WHERE map.tag_id = tags.id AND (tags.name IN ('mysql', 'database')) AND map.post_id = posts.id GROUP BY posts.id HAVING COUNT( posts.id ) = 2";
Я не понимаю последний ряд. Может кто-нибудь объяснить, пожалуйста, для меня? Какая разница, если у меня его там нет?
В последнем ряду говорится, что вы оставляете только те группы, которые имеют ровно 2 идентификатора записи. Если вы удалите его, будут выбраны все группы.
Из документов:
Предложение HAVING применяется почти последним, непосредственно перед отправкой элементов клиенту, без оптимизации. (LIMIT применяется после HAVING.)
Таким образом, применяется условие where, затем группируется, затем имеет .. Имея, может применяться к значениям, рассчитанным после того, как ваша группа свернула все ваши агрегаты, например SUM или MAX.
http://dev.mysql.com/doc/refman/5.1/en/select.html
Предикат "HAVING" действует как фильтр, который выбирает только строки с двумя (2) одинаковыми post.id.
Похоже, что запрос ищет строки с дублирующимися идентификаторами.
HAVING COUNT( posts.id ) > 1
, вероятно, будет лучше для этой цели.