MySQL:多个并集中的相同字段值
我使用MySQL5.1,我有一个表,我们在其中记录有关作业的操作。以下是其模式定义:MySQL:多个并集中的相同字段值,mysql,sql,database,union,Mysql,Sql,Database,Union,我使用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, PRIM
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;
我需要创建一个请求生成器,以便用户可以使用“AND”和“OR”运算符以及括号搜索表。SQL请求应该返回候选ID。
例如,他们应该能够进行以下搜索:“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;
用户也可以在不指定作业的情况下进行搜索。在这种情况下,任何作业都应该匹配
这就是问题所在:必须采取行动才能使同一个作业成为有效的结果。
例如,使用上面的示例,作业1的“ActionA”和作业2的“ActionB和ActionC”不应该是有效匹配
如果没有指定工作,我找不到一种方法来完成这项工作。在这种情况下,也许工会条款不是解决问题的办法 我认为这就足够了:
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' ;
我认为这就足够了:
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' ;
问题是没有指定作业id。如果没有指定作业,请删除
job\u id=1858
条件。我的解决方案过于复杂。你的要简单得多,而且能胜任。谢谢问题是没有指定作业id。如果没有指定作业,请删除job\u id=1858
条件。我的解决方案过于复杂。你的要简单得多,而且能胜任。谢谢