php - 我怎样才能自己加入一个表以获得每个唯一项目的第一个或最后一个?

标签 php mysql join

我有一段时间以来一直在处理以下 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/

相关文章:

php - 如何结束一个json数据数组,并回显另一个值?

mysql - 如何创建左连接而不在左侧重复行

php - MySQL:连接表重复 SUM()

php - PHP中的htmlentities但保留html标签

php - 使用 LIKE 的 SQL 搜索查询

php - 如何使用 onchange 让多个表行出现/消失

php - 网站用户帐户目录访问

mysql - 我可以从 MySQL DB 中获取多个字符串作为单个 'glued' 字符串吗?

mysql - 如何修复 'Out of range value adjusted for column' 错误?

mysql - 需要mysql查询从两个表中提取数据