使用条件の集約:
SELECT t1.id, t1.name
FROM users t1
INNER JOIN
(
SELECT s.user_id
FROM skills s
GROUP BY s.user_id
HAVING SUM(CASE WHEN s.skill LIKE '%php%' OR
s.skill LIKE '%mysql%' THEN 1 ELSE 0 END) >= 2
) t2
ON t2.user_id = t1.id
内側のクエリは、両方のPHP
とMySQL
スキルを持っているユーザーを見つけ、この結果は、この要件に一致する名前だけを返すようにusers
テーブルをフィルタリングするために使用されます。
特定のスキルが特定のユーザーに対して1回だけ表示されると私は考えています。同じスキルが同じユーザーに対して複数回表示される可能性がある場合は、クエリをわずかに変更する必要があります。
更新:
あなたskills
表は、特定のユーザーに複数回のためにリストされている同じスキルを持っている可能性がある場合は、DISTINCT
を使用して、これらの重複エントリを無視することができます
SELECT t1.id, t1.name
FROM users t1
INNER JOIN
(
SELECT s.user_id
FROM (SELECT DISTINCT user_id, skill FROM skills) s
GROUP BY s.user_id
HAVING SUM(CASE WHEN s.skill LIKE '%php%' OR s.skill LIKE '%mysql%'
OR s.skill LIKE '%javascript%' THEN 1 ELSE 0 END) >= 3
) t2
ON t2.user_id = t1.id
を
マークの下のフィドルでは、ではなく、が結果セットに表示されます。彼はスキルとしてPHPを2回掲載していますが、MySQLまたはJavaScriptを持っていません。
また、何も返さないです。ここで見てください、私はSQLスキーマを作ったばかりです。http://sqlfiddle.com/#!9/5008a6/1 – Ridd
@Riddあなたは 'AND'演算子ではなく' OR'演算子を使いたいと思います。私の更新を確認してください。 –
これは素晴らしいことです!ありがとうございました。それはより複雑ですが、私はそれも効率的で、私のdbを殺さないことを願っ:)再びありがとう。 – Ridd