【问题标题】:Mysql sort the results based on 2 columns from different tablesMysql根据来自不同表的2列对结果进行排序
【发布时间】:2020-05-14 05:24:22
【问题描述】:

我有 2 个结构如下的表

Products

id | name      | created_at          |
 1 | Produt1   | 2019-11-01 19:05:56 |
 2 | Product 2 | 2020-01-28 19:05:56 |
 3 | Product 3 | 2020-01-26 19:05:56 |

Draws

id | product_id |draw_number | created_at          |
 1 |          1 |          1 | 2020-01-28 19:05:56 | 
 2 |          1 |          2 | 2020-01-27 19:05:56 |

场景是,我们在产品表中有 3 个产品,对于产品 1,我们在抽奖表中有 2 个条目。

我在这里寻找一个查询,从产品表中选择数据并且数据应该按以下顺序排序

  1. 如果draws created_at 存在,则按draw created at 排序
  2. 如果没有抽奖,按产品表的创建时间排序。

结果输出应该是这样的

id | name      | created_at          |
 1 | Produt1   | 2019-01-28 19:05:56 | //created_at of draws of latest draw for this product
 2 | Product 2 | 2020-01-28 19:05:56 |
 3 | Product 3 | 2020-01-26 19:05:56 |

如何选择预期的数据? TIA

【问题讨论】:

  • 如果你使用 laravel,我猜created_at 将永远存在于每一行。所以,只需添加order by draws.created_at, products.created_at
  • @FelippeDuarte,但是如何按抽奖表中的最新条目排序?

标签: php mysql laravel sorting left-join


【解决方案1】:

测试

SELECT t1.*
FROM Products t1
LEFT JOIN ( SELECT t2.product_id,
                   MAX(t2.created_at) created_at 
            FROM Draws t2
            GROUP BY product_id ) t3 ON t1.id = t3.product_id
ORDER BY GREATEST(t1.created_at, t3.created_at) DESC

【讨论】:

  • 正是我想要的。谢谢
【解决方案2】:

这会给你想要的结果

CREATE TABLE Draws
    (`id` int, `product_id` int, `draw_number` int, `created_at` datetime)
;
    
INSERT INTO Draws
    (`id`, `product_id`, `draw_number`, `created_at`)
VALUES
    (1, 1, 1, '2020-01-28 19:05:56'),
    (2, 1, 2, '2020-01-27 19:05:56')
;
✓ ✓
CREATE TABLE Products
    (`id` int, `name` varchar(9), `created_at` datetime)
;
    
INSERT INTO Products
    (`id`, `name`, `created_at`)
VALUES
    (1, 'Produt1', '2019-11-01 19:05:56'),
    (2, 'Product 2', '2020-01-28 19:05:56'),
    (3, 'Product 3', '2020-01-26 19:05:56')
;
✓ ✓
SELECT p.id,p.name,MAX( IFNULL(d.`created_at` , p.`created_at`))
FROM Draws d RIGHT JOIN Products p 
ON d.product_id = p.id
GROUP BY p.id,p.name
ORDER BY p.id;
编号 |姓名 | MAX( IFNULL(d.`created_at` , p.`created_at`)) -: | :-------- | :-------------------------------------------- 1 |产品1 | 2020-01-28 19:05:56 2 |产品 2 | 2020-01-28 19:05:56 3 |产品 3 | 2020-01-26 19:05:56

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2015-05-10
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多