在Mysql ON子句中将条件与AND组合

时间:2013-03-14 14:36:11

标签: mysql sql database

我有以下查询,用于根据software_id和level过滤行。 我已将条件放在ON-Clause中,因为我仍然希望返回行,其中JobadvertsSoftware表中没有相应的行。

SELECT `Jobadvert`.`id` FROM `jobadverts` AS `Jobadvert` 

LEFT JOIN `users` AS `User` ON (`Jobadvert`.`user_id` = `User`.`id`) 

LEFT JOIN `jobadverts_softwares` AS `JobadvertsSoftware_0` ON
(`Jobadvert`.`id` = 'JobadvertsSoftware_0.jobadvert_id' AND 
(`JobadvertsSoftware_0`.`software_id` = '32' AND 
`JobadvertsSoftware_0`.`level` IN ('1', 4))) 


WHERE `Jobadvert`.`active` = 1 AND `User`.`premium` = '1' AND 
Jobadvert`.`department_id` = (5) 

GROUP BY `Jobadvert`.`id`

问题是它还会返回JobadvertsSoftware行,其中level为例如2 同样,如果我把它放在WHERE子句中,它将过滤掉不存在JobadvertsSoftware的行,而不应该这样做。 如何告诉MySQL返回Jobadvert的所有行,其中给定的software_id和级别匹配或为NULL?

4 个答案:

答案 0 :(得分:0)

试试这个:

SELECT `Jobadvert`.`id`, `JobadvertsSoftware_0`.`level` 
FROM `jobadverts` AS `Jobadvert` 

LEFT JOIN `users` AS `User` ON (`Jobadvert`.`user_id` = `User`.`id`) 

INNER JOIN `jobadverts_softwares` AS `JobadvertsSoftware_0` ON
(`Jobadvert`.`id` = 'JobadvertsSoftware_0.jobadvert_id' AND 
(`JobadvertsSoftware_0`.`software_id` = '32' AND 
`JobadvertsSoftware_0`.`level` IN ('1', 4))) 


WHERE `Jobadvert`.`active` = 1 AND `User`.`premium` = '1' AND 
Jobadvert`.`department_id` = (5) 

GROUP BY `Jobadvert`.`id`

Saludos!

答案 1 :(得分:0)

试试这个(有些字段在字符串上是数字有点不清楚,可能会更正):

SELECT distinct(`Jobadvert`.`id`) FROM `jobadverts` AS `Jobadvert`  
LEFT JOIN `users` AS `User` ON (`Jobadvert`.`user_id` = `User`.`id`) 
LEFT JOIN `jobadverts_softwares` AS `JobadvertsSoftware_0` 
ON `Jobadvert`.`id` =     `JobadvertsSoftware_0.jobadvert_id`
WHERE 
`Jobadvert`.`active` = 1 
AND `User`.`premium` = '1' 
AND Jobadvert`.`department_id` = (5) 
AND JobadvertsSoftware_0`.`software_id` = '32' 
AND (`JobadvertsSoftware_0`.`level` IN (1, 4) OR `JobadvertsSoftware_0`.`level` is NULL)

答案 2 :(得分:0)

假设连接不需要ON子句中的级别参数,您可以在Software表上执行嵌套SELECT,以清除首先不需要的数据:

SELECT * FROM jobadverts_softwares
WHERE 
   (`software_id` = 32 OR `software_id` IS NULL) --Select all software_id that are 32 or null
AND
   `level` IN (1, 4)

然后,您可以将其作为嵌套语句合并到主SQL查询中,这样您只需加入在LEFT JOIN中过滤的数据,但保留所需的任何空值:

SELECT `Jobadvert`.`id` 
FROM `jobadverts` AS `Jobadvert` 

LEFT JOIN `users` AS `User`
ON `Jobadvert`.`user_id` = `User`.`id`

LEFT JOIN 
(   --Software Subquery
    SELECT `jobadvert_id`, `level` FROM jobadverts_softwares
    WHERE 
       (`software_id` = 32 OR `software_id` IS NULL) --Select all software_id that are 32 or null
    AND
       `level` IN (1, 4)
) AS `software_subquery`

ON `Jobadvert`.`id` = `software_subquery`.`jobadvert_id`

WHERE
    `Jobadvert`.`active` = 1
AND 
    `User`.`premium` = '1'
AND 
    `Jobadvert`.`department_id` = 5 

ORDER BY `Jobadvert`.`id` --Changed GROUP BY to ORDER BY as not needed

这是未经测试的,但请尝试一下,看看这是否会有所帮助。

答案 3 :(得分:-1)

试试这个:

SELECT j.id 
FROM jobadverts j 
LEFT JOIN User u ON (j.user_id = u.id) 
LEFT JOIN jobadverts_softwares AS js ON
(j.id = js.jobadvert_id)
WHERE j.active = 1 
  AND u.premium = '1' 
  AND j.department_id = (5) 
  AND js.software_id` = '32' 
  AND js.level IN ('1', 4))) 

除非以某种方式对数据求和,否则您不需要GROUP BY。