MYSQL:如何从具有相同列 id 值的多行中获取一行

分享于2022年07月17日 mysql sql 问答
【问题标题】:MYSQL:如何从具有相同列 id 值的多行中获取一行(MYSQL: how to get one row from multiple rows with same column id value)
【发布时间】:2022-01-24 18:48:21
【问题描述】:

我有两个表:product 和 productVariation:产品变体表包含同一产品但具有不同属性的多个条目。

示例: 产品: 身份证名称 1 顶 2 底部

id name
1 top
2 bottom

产品变化表:

id product_id color_id size_id
1 1 4 7
2 1 5 7
3 1 8 7
4 1 7 10

所以对于上面的表格,当我查询要显示的产品列表的数据时,假设用户想要 size_id 7 的数据,那么我们有 3 种可能性(3 种不同的颜色)但是在产品列表页面上,我只是想要显示该产品的一个条目。我的问题是如何才能根据产品变体表中的 product_id 获取一个条目。我已经编写了一个根据颜色和大小过滤数据的查询,但是我得到了同一个产品的多个条目,我只想要这些行中的一个。

谢谢! :)

  • 当您获得产品-颜色-尺寸组合的多个值时,这取决于您希望将哪个字段用作决胜局。您在 productVariation 表上还有其他列可以用作决胜局吗?例如,插入记录的时间戳。

【解决方案1】:

我猜 row_number 在这里可能有用。
如果您的 MySql 或 MariaDB 版本支持它。

SELECT product_id, product_name, color_id, size_id
FROM
(
    SELECT 
      pvar.product_id
    , product.name AS product_name
    , pvar.color_id
    , pvar.size_id
    , row_number() over (partition by pvar.product_id order by pvar.id DESC) AS rn
    FROM product AS product
    JOIN productVariation AS pvar
      ON pvar.product_id = product.id
    WHERE pvar.product_id IN (1)
      AND pvar.size_id = 7
) q
WHERE rn = 1

或者也许只是 LIMIT 结果集。

SELECT 
  pvar.product_id
, product.name AS product_name
, pvar.color_id
, pvar.size_id
FROM product AS product
JOIN productVariation AS pvar
  ON pvar.product_id = product.id
WHERE pvar.product_id IN (1) 
  AND pvar.size_id = 7
ORDER BY pvar.product_id, pvar.id DESC
LIMIT 1