SQL の場合と同様に、小さなセクションに分割すると役立ちます。つまり、最初に必要なのは、現在のユーザーが所有する短いリスト内のすべてのアイテムです。
SELECT Item_ID
FROM tbl_ShortList_Items
INNER JOIN tbl_ShortLists
ON tbl_ShortLists.ID = tbl_ShortList_Items.ShortList_ID
WHERE Owner = 1 -- CURRENT USER
次に、同じアイテムを含む短いリストを持つすべてのユーザーが必要です。説明のためにIN
ステートメントとして作成しますが、INNER JOIN の方がパフォーマンスが良い場合があります。
SELECT Owner
FROM tbl_ShortList_Items
INNER JOIN tbl_ShortLists
ON tbl_ShortLists.ID = tbl_ShortList_Items.ShortList_ID
WHERE Item_ID IN
-- RESULTS FROM LAST QUERY START
( SELECT Item_ID
FROM tbl_ShortList_Items
INNER JOIN tbl_ShortLists
ON tbl_ShortLists.ID = tbl_ShortList_Items.ShortList_ID
WHERE Owner = 1 -- CURRENT USER
)
-- RESULTS FROM LAST QUERY END
AND Owner != 1 -- CURRENT USER
GROUP BY
次に、およびを追加して、これを 2 つ以上のものに制限する必要があります。HAVING
SELECT Owner
FROM tbl_ShortList_Items
INNER JOIN tbl_ShortLists
ON tbl_ShortLists.ID = tbl_ShortList_Items.ShortList_ID
WHERE Item_ID IN
-- RESULTS FROM LAST QUERY START
( SELECT Item_ID
FROM tbl_ShortList_Items
INNER JOIN tbl_ShortLists
ON tbl_ShortLists.ID = tbl_ShortList_Items.ShortList_ID
WHERE Owner = 1 -- CURRENT USER
)
-- RESULTS FROM LAST QUERY END
AND Owner != 1 -- CURRENT USER
GROUP BY Owner
HAVING COUNT(DISTINCT tbl_ShortList_Items.Item_ID) > 1
tbl_users
次に、これらの所有者のアバターを取得するために使用する必要があります
SELECT User_ID, Avatar
FROM tbl_Users
WHERE User_ID IN
-- RESULTS FROM LAST QUERY START
( SELECT Owner
FROM tbl_ShortList_Items
INNER JOIN tbl_ShortLists
ON tbl_ShortLists.ID = tbl_ShortList_Items.ShortList_ID
WHERE Item_ID IN
( SELECT Item_ID
FROM tbl_ShortList_Items
INNER JOIN tbl_ShortLists
ON tbl_ShortLists.ID = tbl_ShortList_Items.ShortList_ID
WHERE Owner = 1 -- CURRENT USER
)
AND Owner != 1 -- CURRENT USER
GROUP BY Owner
HAVING COUNT(DISTINCT tbl_ShortList_Items.Item_ID) > 1
)
-- RESULTS FROM LAST QUERY END
私が言ったように、これを JOIN に再配置するとより最適化されると思いますが、この理論をテストしていません。
SELECT User_ID, Avatar
FROM tbl_Users
INNER JOIN
( SELECT Owner
FROM tbl_ShortList_Items
INNER JOIN tbl_ShortLists
ON tbl_ShortLists.ID = tbl_ShortList_Items.ShortList_ID
INNER JOIN
( SELECT Item_ID
FROM tbl_ShortList_Items
INNER JOIN tbl_ShortLists
ON tbl_ShortLists.ID = tbl_ShortList_Items.ShortList_ID
WHERE Owner = 1 -- CURRENT USER
) CurrentUserItems
ON CurrentUserItems.Item_ID = tbl_ShortList_Items.Item_ID
WHERE Owner != 1
GROUP BY Owner
HAVING COUNT(DISTINCT tbl_ShortList_Items.Item_ID) > 1
) MatchUsers
ON MatchUsers.Owner = tbl_Users.User_ID