【发布时间】:2016-12-03 16:22:48
【问题描述】:
我有以下 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,这是第二低的。
【问题讨论】:
-
您能发布一些来自
cnt_lists和cnt的示例表数据吗? -
@WEBjuju 我已经添加了示例表数据。
-
是的,就是样本表数据。还请提供来自
cnt的一些数据。 -
@WEBjuju 该数据来自
cnt_lists表。 -
这个作业/面试问题是在不使用
order by或子查询或最大连接技巧的情况下找到第一个/最后一个吗?因为否则尝试使用连接来解决是一种非常愚蠢的方法。