MySQL: группировать строки, если столбец равен тому или другому - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть простая таблица, которая выглядит примерно так:

Restaurant      Category
-------------------------
Restaurant1     American
Restaurant1     French
Restaurant2     American
Restaurant2     French

Глядя на эту таблицу, я вижу, что Restaurant1 имеет как американские, так и французские категории.Я также вижу, что Restaurant2 имеет американские и французские категории.Видя это, я мог бы сказать, что есть 2 сообщения, которые имеют как американские, так и французские категории.

Можно ли перевести это на MySQL?Таким образом, запрос должен быть чем-то вроде «get count (Restaurant) group by Restaurant, если Category = American и Category = French».Я знаю, что для MySQL это не имело бы никакого смысла, но я не могу понять, как это сделать.

Я заметил, что если бы американцы и французы были сгруппированы, если пост был одинаковым, то я мог былегко сгруппировать его по ресторану, но я не уверен, есть ли способ сделать это в MySQL.

Для примера из реального мира я пытаюсь подсчитать, сколько постов в WordPress имеют обакатегория с идентификатором 22 и категория с идентификатором 25. Приведенный ниже запрос должен возвращать 3. Это количество сообщений, которые имеют категории 22 и 25.

SELECT COUNT(tr.object_id) AS post_count 
FROM wp_term_relationships AS tr
WHERE tr.term_taxonomy_id=25 AND tr.term_taxonomy_id=22

Кто-нибудь запускалв этот вопрос раньше?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы можете использовать запрос как этот.Он использует производную таблицу, которая суммирует, сколько разных категорий в каждом ресторане имеют соответствие American или French.Затем он суммирует количество ресторанов, которые имеют 2 совпадающие категории, т.е. они оба American и French.

SELECT COUNT(Restaurant)
FROM (SELECT Restaurant, COUNT(DISTINCT Category) AS Am_or_Fr
      FROM restaurants
      WHERE Category IN ('American', 'French')
      GROUP BY Restaurant) r
WHERE Am_or_Fr = 2

Вывод (для ваших выборочных данных)

2

Asmall demo для SQLFiddle

Обновление

Для запроса, добавленного к вашему сообщению, его необходимо переписать так:

SELECT COUNT(t.object_id) AS post_count 
FROM (SELECT tr.object_id, COUNT(DISTINCT tr.term_taxonomy_id) AS term_count
      FROM wp_term_relationships AS tr
      WHERE tr.term_taxonomy_id IN (22, 25)
      GROUP BY tr.object_id) t
WHERE term_count = 2
0 голосов
/ 11 декабря 2018

Я не уверен, какой у вас вопрос.Но если вы хотите посчитать, сколько ресторанов имеют одну и ту же категорию, вы можете использовать что-то вроде

SELECT COUNT(Restaurants) As output_variable_name 
from table_name 
WHERE Category=category_name_1 AND Category=category_name_2
...