0
  • 仕事; ID
  • task_assign; ID、タスク ID
  • task_state; id、assign_id
  • 州; id、state_id、define_id

ここに画像の説明を入力

他のテーブルの選択した ID に含めたい

SELECT DISTINCT t.id,t.* FROM tasks AS t
INNER JOIN task_assign AS ta1 ON ta1.task_id=t.id
INNER JOIN task_state AS ts1 ON ts1.assign_id=ta1.id
INNER JOIN states AS s1 ON s1.id=ts1.state_id AND s1.define_id=14
INNER JOIN task_assign AS ta2 ON ta2.task_id=t.id
INNER JOIN task_state AS ts2 ON ts2.assign_id=ta2.id
INNER JOIN states AS s2 ON s2.id=ts2.state_id AND s2.define_id=21
.
.
.
INNER JOIN task_assign AS ta5 ON ta5.task_id=t.id
INNER JOIN task_state AS ts5 ON ts5.assign_id=ta5.id
INNER JOIN states AS s5 ON s5.id=ts5.state_id AND s5.define_id=25

これは機能しますが、リクエストが増えると遅くなります。別の方法はありますか?

4

1 に答える 1

2
SELECT
    t.id
FROM
    tasks t
INNER JOIN
    task_assign ta1
    ON ta1.task_id = t.id
INNER JOIN
    task_state ts1
    ON ts1.assign_id = ta1.id
INNER JOIN
    states s1
    ON s1.id = ts1.state_id
    AND s1.define_id IN (14,25)
GROUP BY
    t.id
HAVING
    COUNT(DISTINCT s1.define_id) = 2

編集 - これが何をするかを OP に説明するには...これは最初に、define_id が 14 または 25 のいずれかであるすべてのレコードを取得しますが、HAVING句はクエリが両方を持つものを返すことのみを許可します。

于 2013-01-03T07:40:55.093 に答える