【问题标题】:how can I get a DISTINCT from mySQL but only for 1 field?如何从 mySQL 中获取 DISTINCT 但仅针对 1 个字段?
【发布时间】:2015-10-04 18:42:16
【问题描述】:

我有一行产品,我想获得 10 条随机记录,但每个 user_id 最多 1 行。现在我有这个:

SELECT user_id, product_id, price, name, category, is_featured 
FROM db_products
WHERE category!=15 AND active=1 AND deleted=0 AND is_featured=1 
ORDER BY RAND() DESC LIMIT 0,12

我尝试了SELECT DISTINCT user_id, ...,但这不起作用。该表有 100 种产品,每个 user_id 可能有多个产品,但我想每个 user_id 最多检索 1 个,但总共还是 10 个。

如果没有更复杂的结构,这可能吗?

【问题讨论】:

标签: mysql


【解决方案1】:

我可能遗漏了一些东西,但是您尝试过 GROUP BY 吗?

SELECT user_id, product_id, price, name, category, is_featured 
FROM db_products
WHERE category!=15 AND active=1 AND deleted=0 AND is_featured=1 
GROUP BY user_id -- SPECIFY FIELD HERE
ORDER BY RAND() DESC 
LIMIT 0,12

这将为每个用户分组一行,或者您希望分组的任何字段。

【讨论】:

  • 成功了,非常感谢!将在 5 分钟内将您的答案作为第一个接受 :)
  • 这不是真正的随机解决方案。您首先分组,然后随机化顺序,这意味着您正在随机化用户的顺序,但不是他们的值,并且在分组时只获取数据库顺序中的第一个值。尝试执行几次,你会看到。这是 SQL fiddle 中的示例:sqlfiddle.com/#!9/2b24b/3
【解决方案2】:

在子查询中随机排序后尝试在主查询中进行分组:

SELECT * FROM
(SELECT user_id, product_id, price, name, category, is_featured 
FROM db_products
WHERE category!=15 AND active=1 AND deleted=0 AND is_featured=1 
ORDER BY RAND()) AS subquery
GROUP BY user_id
LIMIT 0,10

【讨论】:

  • 是的,似乎就是这样。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 2016-01-13
  • 2017-09-28
  • 2015-01-28
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多