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 не должно быть допустимым соответствием.



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

590   1  

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

    Ничего не найдено.