【发布时间】:2016-12-02 13:42:25
【问题描述】:
我有一个查询,它自行连接以获取每个唯一列表的最新或最旧订单记录。
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 端使用这两个记录中的哪一个?
我只是在寻找想法,因为我试图避免必须单独查询每个列表的 N + 1 查询问题。
【问题讨论】: