MySQL选择查询条件

时间:2011-08-22 16:10:15

标签: mysql sql select mysqldump

您好,

我有以下sql表+数据:

CREATE TABLE IF NOT EXISTS `job_requires` (  
   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  
   `Job_id` bigint(20) unsigned NOT NULL,
   `Group_Index` int(11) NOT NULL,  
   `Field_id` bigint(20) unsigned NOT NULL,  
   `Field_Value` int(11) NOT NULL,
   PRIMARY KEY (`id`)
) 

INSERT INTO `job_requires` 
    (`id`, `Job_id`, `Group_Index`, `Field_id`, `Field_Value`) 
VALUES
    (1, 7, 1, 11, 50),
    (2, 7, 1, 14, 50),
    (3, 7, 1, 11, 59),
    (4, 7, 2, 14, 1),
    (5, 7, 2, 11, 2),
    (6, 8, 1, 14, 55),
    (7, 8, 1, 11, 50),
    (8, 8, 1, 14, 59),
    (9, 8, 2, 11, 60),
    (10, 8, 2, 14, 61);

我需要通过基于'Field_id'+'Field_Value'字段过滤来获取所有'Job_id'。 我希望查询类似于:

SELECT job_requires.Job_id 
FROM job_requires 
WHERE (Field_id=11 AND Field_Value=50) AND (Field_id=14 AND Field_Value=1)

我的问题是我希望查询也基于 Group_Index 字段: 仅当我之前的查询中的“Job_id”同时包含两个条件,并且这些条件具有相同的 Group_Index 时,它应该在查询的结果中。

更新:我不知道查询会有多少个过滤器,也可能是:

SELECT job_requires.Job_id 
FROM job_requires 
WHERE (Field_id=11 AND Field_Value=50) AND (Field_id=14 AND Field_Value=1) AND (Field_id=16 AND Field_Value=56) AND (Field_id=12 AND Field_Value=26)

我希望你理解我的问题,因为我的英语不是很好:(

非常感谢

4 个答案:

答案 0 :(得分:1)

SELECT j1.Job_id
    FROM job_requires j1
        INNER JOIN job_requires j2
            ON j1.Job_id = j2.Job_id
                AND j1.Group_Index = j2.Group_Index
    WHERE j1.Field_id = 11 AND j1.Field_Value = 50
      AND j2.Field_id = 14 AND j2.Field_Value = 1

答案 1 :(得分:1)

显然以下是不可能的:

WHERE (Field_id=11 AND Field_Value=50) AND (Field_id=14 AND Field_Value=1)

由于Field_id不能同时为11和14,因此一行中的字段只能包含一个值。

所以这应该是:

WHERE (Field_id=11 AND Field_Value=50) OR (Field_id=14 AND Field_Value=1)

如果要将group_index组合在一起,则应将其包括在内括号中:

SELECT 
  job_requires.Job_id 
FROM job_requires 
WHERE (Field_id=11 AND Field_Value=50 AND Group_Index = 1) 
      OR (Field_id=14 AND Field_Value=1 AND Group_index = 2)

这应该有用。

如果你想选择一个job_id集群,那么你应该像@ Joe的答案一样进行自我加入。

答案 2 :(得分:0)

这是一种做法......将表连接到自身:

SELECT j1.Job_id 
FROM job_requires j1
    INNER JOIN job_requires j2
        ON j1.Job_id = j2.job_id
            AND j1.Field_id=11 AND j1.Field_Value=50 AND j2.Field_id=14 AND j2.Field_Value=1

<强>更新 我看了这个,现在我更喜欢这个,因为它避免了加入。

SELECT j1.Job_id 
FROM job_requires j1
WHERE j1.Field_id=11 AND j1.Field_Value=50
    AND (SELECT COUNT(*)
         FROM job_requires j2
         WHERE j2.Job_id = j1.Job_id AND j2.Field_id=14 AND j2.Field_Value=1) > 0

更新#2 如果您有其他参数,则只需添加select count(*)语句:

SELECT j1.Job_id 
FROM job_requires j1
WHERE j1.Field_id=11 AND j1.Field_Value=50
    AND (SELECT COUNT(*)
         FROM job_requires j2
         WHERE j2.Job_id = j1.Job_id AND j2.Field_id=14 AND j2.Field_Value=1) > 0
    AND (SELECT COUNT(*)
         FROM job_requires j3
         WHERE j3.Job_id = j1.Job_id AND j3.Field_id=15 AND j3.Field_Value=98) > 0
    AND (SELECT COUNT(*)
         FROM job_requires j4
         WHERE j4.Job_id = j1.Job_id AND j4.Field_id=16 AND j4.Field_Value=11) > 0

答案 3 :(得分:0)

SELECT job_requires.Job_id, COUNT( DISTINCT Group_Index ) AS group_index_count
 FROM job_requires
 WHERE (Field_id=11 AND Field_Value=50) OR (Field_id=14 AND Field_Value=1)
 HAVING group_index_count = 1

我不太确定我是否完全明白你想做什么,但我猜这可能会起到作用。