0

次のクエリを使用して、software_id と level に基づいて行をフィルター処理します。JobadvertsSoftware テーブルに対応する行がない場合でも、行を返したいので、条件を ON 節に入れました。

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`

問題は、レベルがたとえば 2 である JobadvertsSoftware-rows も返すことです。これを WHERE 句に入れると、すべきでない JobadvertsSoftware がない行が除外されます。指定された software_id AND レベルが一致するか NULL である Jobadvert のすべての行を返すように MySQL に指示するにはどうすればよいですか?

4

4 に答える 4

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`

サルドス!

于 2013-03-14T14:51:22.420 に答える
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)
于 2013-03-14T14:53:26.637 に答える
-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 は必要ありません。

于 2013-03-14T15:00:25.153 に答える