MySQL: одно и то же значение поля в множественном объединении
Я использую MySQL5. 1, и у меня есть таблица, где мы регистрируем действия относительно заданий. Вот его определение схемы:
CREATE TABLE `actions_log` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`action` varchar(45) DEFAULT NOT NULL,
`job_id` int(10) unsigned NOT NULL,
`candidate_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Мне нужно создать конструктор запросов, чтобы пользователи могли искать таблицу с помощью операторов" и "И" ИЛИ", а также скобок. SQL-запрос должен возвращать идентификаторы кандидатов.
Например, они должны иметь возможность выполнить следующий поиск: "ActionA или (ActionB и ActionC)".
Я использовал союзные предложения, чтобы достичь этого, и это делает работу, когда конкретная работа является при условии:
SELECT `candidate_id` FROM (
SELECT `candidate_id` FROM `actions_log` WHERE `job_id` = 1858 AND `action` = 'a'
UNION DISTINCT
(
SELECT `candidate_id` FROM (
SELECT `candidate_id`, COUNT(`candidate_id`) AS `count` FROM (
SELECT DISTINCT `candidate_id` FROM `actions_log` WHERE `job_id` = 1858 AND `action` = 'b'
UNION ALL
SELECT DISTINCT `candidate_id` FROM `actions_log` WHERE `job_id` = 1858 AND `action` = 'c'
) AS level1
GROUP BY `candidate_id`
) AS level2
WHERE `count` = 2
)
) AS candidates;
Пользователи также могут осуществлять поиск без указания задания. В этом случае любая работа должна соответствовать.
Вот в чем проблема: действие должно быть для того же самого задания, чтобы быть действительным результатом.
Например, используя приведенный выше пример, наличие "ActionA "для задания 1 и" (ActionB и ActionC) " для задания 2 не должно быть допустимым соответствием.
Я не мог найти способ сделать эту работу, если задание не указано. Может быть, в этом случае союзные условия-не лучший путь.
1 ответ:
Я думаю, этого достаточно:
SELECT candidate_id FROM actions_log AS a WHERE job_id = 1858 AND ( action = 'a' OR action = 'b' AND EXISTS ( SELECT candidate_id FROM actions_log WHERE job_id = a.job_id AND action = 'c' ) ) ;Или если вы хотите, чтобы условия были разделены, так что вы можете построить более сложные запросы проще:
SELECT candidate_id FROM actions_log AS a WHERE job_id = 1858 AND action = 'a' UNION DISTINCT SELECT b.candidate_id FROM actions_log AS b JOIN actions_log AS c ON c.candidate_id = b.candidate_id AND c.job_id = b.job_id WHERE b.job_id = 1858 AND b.action = 'b' AND c.action = 'c' ;
Comments