我有一段时间以来一直在处理以下 MySQL 查询。我正在尝试为 in
语句中的每个 list_id
获取一条唯一记录。我自己连接表并检查 lists.ordered
表以确定我是否需要获取第一个或最后一个订单项。
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 ( ( lists.ordered = 1
AND cnt1.id < cnt2.id )
OR ( lists.ordered = 0
AND cnt1.id > cnt2.id ) ) )
WHERE cnt2.id IS NULL
AND cnt1.list_id IN ( '3176', '3295', '3296' )
AND cnt1.listable_type = 'App\\Models\\Movie';
抓取最后一件商品效果很好,但当我尝试抓取第一个订单商品时,它实际上抓取了第二个。
有人有什么建议吗?
示例数据:
id list_id listable_id listable_type order created_at updated_at
2226 3296 7 App\Models\Movie 1 2016-12-02 12:56:29 2016-12-02 15:07:42
2224 3296 1 App\Models\Movie 2 2016-11-29 00:06:57 2016-12-02 15:07:42
2227 3296 9 App\Models\Movie 3 2016-12-02 12:56:35 2016-12-02 12:56:35
2228 3296 54 App\Models\Movie 4 2016-12-02 12:56:39 2016-12-02 12:56:39
2229 3296 40 App\Models\Movie 5 2016-12-02 12:56:43 2016-12-02 12:56:43
2230 3296 65 App\Models\Movie 6 2016-12-02 12:56:47 2016-12-02 12:56:47
在上面的示例中,如果 lists.ordered = 0
它将获取 2230
行,因为它是最高的 order
。如果 lists.ordered = 1
它将抓取 2226
行,因为它是最低的 order
。最高的工作正常,但最低的是 2224
,这是第二低的。
最佳答案
不要尝试在单个 SQL 中执行此操作。相反,编写应用程序代码或存储过程以在“第一个”和“最后一个”之间进行选择。
比这更简单的可能是这样的:
SELECT ... FROM ...
ORDER BY ordered ASC -- ASC gives #1; DESC gives #6 in the example
LIMIT 1;
如果输出超过一行,您可能需要 Groupwise max问题。
好吧,有一种凌乱的方法可以在一条语句中做到这一点:
( SELECT 0 AS which, ... ORDER BY ordered ASC LIMIT 1 )
UNION ALL
( SELECT 1 AS which, ... ORDER BY ordered DESC LIMIT 1 )
HAVING which = (however you pick first vs last);
关于php - 我怎样才能自己加入一个表以获得每个唯一项目的第一个或最后一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40949877/