一意のリストごとに最新のレコードまたは古いレコードを取得するために、それ自身で結合するクエリがあります。MySQLのCASEに基づいて演算子を動的に定義する方法はありますか?
SELECT
lists.ordered,
cnt1.*
FROM
cnt_lists as cnt1
LEFT JOIN
lists
on
cnt1.list_id = lists.id
LEFT JOIN
cnt_lists as cnt2
on
(cnt1.list_id = cnt2.list_id AND cnt1.id < cnt2.id)
WHERE
cnt2.id is null and cnt1.list_id in ('3176', '3295', '3296') and cnt1.listable_type = 'Movie';
このクエリは素晴らしい作品が、lists.ordered
は0または1 lists.ordered = 0
のいずれかになります私はon
文のオペレータがcnt1.id < cnt2.id
になりたいけどlists.ordered = 1
は、私はそれがcnt1.id > cnt2.id
を逆転させることを希望する場合。
CASE
ステートメントに基づいて演算子を動的に定義する方法はありますか?以下は動作しませんが、私はアイデアを持って遊んでいました。
SELECT
lists.ordered,
CASE
WHEN lists.ordered = 1 THEN '>'
ELSE '<'
END AS operator,
cnt1.*
FROM
cnt_lists as cnt1
LEFT JOIN
lists
on
cnt1.list_id = lists.id
LEFT JOIN
cnt_lists as cnt2
on
(cnt1.list_id = cnt2.list_id AND cnt1.id operator cnt2.id)
WHERE
cnt2.id is null and cnt1.list_id in ('3176', '3295', '3296') and cnt1.listable_type = 'App\\Models\\Movie';
何各リストのために、最上位と最下位の両方を引っ張り、私はPHP側で使用するために、2つのレコードのかを判断できるの仕方は?
私は個々のリストを個別に照会するというN + 1問合せの問題を回避しようとしているので、アイデアを探しています。
私はあなたの2番目のオプションをjoinステートメントのロジックで調べていますが、私は奇妙なことが1つあります。この場合 '(lists.ordered = 1 AND cnt1.id
ATLChris