2

この問題をクエリに変換したいと思います。推測では、3 つの leftjoin と 2 つの select である必要があります

exercises
+-----+---------+
|  id | require | 
+-----+---------+
|  1  |         |
|  2  |    1    |
|  3  |    2    |
|  4  |    3    |
|  5  |         |
|  6  |    5    |
|  7  |         |
+-----+---------+

done
+-----+
|  id |
+-----+
|  1  |
|  2  |
+-----+

演習 1 と 2 を完了した後、どの演習を実行できますか?
解: 3,5,7

私の論理プロセス、ステップバイステップ:
(all) - SELECT(required - done)-(done)
(1,2,3,4,5,6,7) - SELECT((1,2,3,5)- (1,2)) - (1,2)
(1,2,3,4,5,6,7) - SELECT(3,5) - (1,2)
(1,2,3,4,5 ) ,6,7) -(4,6) - (1,2)
(3,5,7)

クエリの書き方は?

4

4 に答える 4

1

副選択のない別の解決策

SELECT e.id FROM exercises e 
LEFT JOIN done d ON d.id = e.id 
LEFT JOIN done d_req ON d_req.id=e.require 
WHERE (d.id IS NULL AND d_req.id IS NOT NULL) 
         OR (e.require IS NULL AND d.id IS NULL)

例示するWHEREことができます(分配法則)

WHERE d.id IS NULL AND (d_req.id IS NOT NULL OR e.require IS NULL )
于 2013-01-18T18:08:21.797 に答える
1

これを行う1つの方法があります。

SELECT * FROM `exercises`
WHERE `id` NOT IN (SELECT `id` FROM `done`)
AND (
    `require` IS NULL OR
    `require` IN (SELECT `id` FROM `done`)
)
ORDER BY `id`
于 2013-01-18T15:27:24.893 に答える
1

これは、ライブ出力を示す実際の SQL フィドルです: http://sqlfiddle.com/#!2/0726b/29/0

また、ここにクエリを貼り付けています:

SELECT id FROM 
(
  SELECT e1.* FROM exercises e1 
  LEFT JOIN done d1 ON e1.id = d1.id
  WHERE d1.id IS NULL

) AS r1

WHERE r1.`require` IS NULL OR r1.`require` IN (SELECT id from done) 
于 2013-01-18T18:18:06.987 に答える
1
select id 
from exercises
where require in (select id from done)
   or require is null
minus
select id from done;

あなたのセットは次のとおりです。

更新:マイナスなし(おそらくそれはあなたを怖がらせた):

select id 
from exercises
where (require in (select id from done)  or require is null)
   and id not in  (select id from done);
于 2013-01-18T14:59:30.890 に答える