Запрос MySQL: пара условий, совпадающих в одном столбце - PullRequest
3 голосов
/ 30 августа 2011

У меня есть эта таблица с именем "events" в моей базе данных mysql:

+-----+-----------+------------------------------+------------+
| ID  | CATEGORY  | NAME                         | TYPE       |
+-----+-----------+------------------------------+------------+
| 1   | 1         | Concert                      | music      |
| 2   | 2         | Basketball match             | indoors    |
| 3   | 1         | Theather play                | outdoors   |
| 4   | 1         | Concert                      | outdoors   |
+-----+-----------+------------------------------+------------+

Мне нужен запрос для подсчета событий с категорией 1 и типом музыки, а также на улице. Это означает, что из таблицы вышеколичество должно быть только 1: есть три события с категорией 1, но только у «Концерта» тип «напольный» и «музыка» (ID 1 и ID 4).

Что это за запрос?Можно ли это сделать?

Ответы [ 6 ]

3 голосов
/ 30 августа 2011

Попробуйте это:

SELECT count(DISTINCT e1.name)
FROM `events` AS e1
JOIN `events` AS e2 ON e1.name = e2.name
WHERE e1.category = 1 
    AND e2.category = 1 
    AND e1.type = 'music' 
    AND e2.type = 'outdoor'

Или более сложный для понимания способ, но гораздо более быстрый, чем предыдущий:

SELECT count(*) FROM (
    SELECT `name`
    FROM `events`
    WHERE `category` = 1
    GROUP BY `name`
    HAVING SUM( `type` = 'music') * SUM( `type` = 'outdoor' ) >= 1
) AS notNeeded
2 голосов
/ 30 августа 2011

Для 2 критериев я бы использовал ответ Алины.Подход, который вы можете использовать для больших чисел, приведен ниже.

SELECT COUNT(*)
FROM   (SELECT `name`
        FROM   `events`
        WHERE  `category` = 1
               AND `type` IN ( 'outdoors', 'music' )
        GROUP  BY `name`
        HAVING COUNT(DISTINCT `type`) = 2) t  
1 голос
/ 30 августа 2011

Попробуйте этот запрос

Select count(*), group_concat(TYPE SEPARATOR ',') as types 
from events where category = 1 
HAVING LOCATE('music', types) and  LOCATE('outdoors', types) 
0 голосов
/ 30 августа 2011
SELECT COUNT(*)
    FROM table
    WHERE category=1
    AND type='music' AND type IN (SELECT type
                                  FROM table
                                  WHERE type = 'outdoor')

одна строка продолжает сбрасывать мое соединение. WTH? я постараюсь опубликовать как комментарий

0 голосов
/ 30 августа 2011

Выберите количество (отдельный идентификатор) как 'eventcount' из событий, где Category = '1' и Введите ('music', 'outdoor')

0 голосов
/ 30 августа 2011

попробовать:

SELECT * FROM `events` AS e1
LEFT JOIN `events` AS e2 USING (`name`)
WHERE e1.`category` = 1 AND e2.`category` = 1 AND e1.`type` = 'music' AND e2.`type` = 'outdoors'
...