【问题标题】:MySQL select query conditionsMySQL选择查询条件
【发布时间】:2011-08-22 16:10:15
【问题描述】:

你好,

我有以下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)

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

非常感谢

【问题讨论】:

    标签: mysql sql select mysqldump


    【解决方案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
    

    【讨论】:

    • 感谢乔的快速回复。我的问题是我不知道查询应该有多少个过滤器。如果还有两个过滤器,例如 (Field_id = 14 AND Field_Value = 99) AND (Field_id = 14 AND Field_Value = 3),我该怎么办
    • @Alon:你可能猜到了,每个额外的过滤器都需要另一个自加入。
    • 我明白了...所以我需要通过为要添加的每个其他条件添加 INNER JOIN 来动态构建此查询?
    【解决方案2】:

    显然以下是不可能的:

    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 的回答那样进行自加入。

    【讨论】:

    • 谢谢 Johan,我必须使用 AND 运算符,而不是 OR - 我知道我的查询是不可能的,这应该类似于嵌套分组过滤器
    • 那么@Joe 的self-join 就是你的良药。
    【解决方案3】:
    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
    

    我不太确定我是否完全理解您想要做什么,但我猜这可能会完成这项工作。

    【讨论】:

    • 谢谢。我喜欢 group_index_count 字段的解决方案,我学到了一些新东西 :) 但它对我不起作用,因为条件运算符是 OR,我需要使用 AND 运算符。
    【解决方案4】:

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

    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
    

    【讨论】:

    • 谢谢纳尼安,但这对我没有帮助,因为查询没有引用每个 job_id 需要相同的 group_index 字段
    猜你喜欢
    • 2011-08-10
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2016-11-16
    相关资源
    最近更新 更多