【问题标题】:MySQL - Selecting single entry per categoryMySQL - 每个类别选择单个条目
【发布时间】:2014-02-18 17:39:54
【问题描述】:

我很抱歉。我已将以下内容编辑为 2 个表格,我只是有点困惑。


我有一个与下面的表格非常相似的表格,我想显示所有 table2-class 1 但每个 table1-category 仅显示 1 个随机项目

示例项目表1

+---------+----------------+---------------+ |身份证 |商品名称 |类别 | +---------+----------------+---------------+ | 01 |项目 A | 1 类 | | 02 | B项| 1 类 | | 03 |项目 C | 2 类 | | 04 | D 项 | 2 类 | | 05 |项目 E | 3 类 | | 06 |项目 F | 3 类 | +---------+----------------+---------------+

示例项目表 2

+---------------+---------------+ |类别 |班级 | +---------------+---------------+ | 1 类 | 1 | | 2 类 | 1 | | 3 类 | 2 | +---------------+---------------+

我想显示所有 table2-class 1,但每个 table1-category 只显示 1 个随机项目

想要的结果

+---------+----------------+---------------+ | 02 | B项| 1 类 | | 03 |项目 C | 2 类 | +---------+----------------+---------------+

(这是在我的 PHP 脚本中)

提前致谢

【问题讨论】:

  • 看函数RAND使用GROUP BYdev.mysql.com/doc/refman/5.0/en/…
  • 谢谢 Marc B。其实我的有点不同,我的整个场景是:我有一个库存 (SQL);我使用了 2 个序列号,项目号和类别号。我有大约 1000 个项目和大约 750 个类别。我需要在 PHP 中执行一个循环来显示所有类别,并且我只需要为每个类别显示一个随机项目。我不认为我可以使用“UNION ALL”.. 是的,更改库存格式不是一种选择
  • 创建一个名为 Categories 的单独表是一个很好的设计
  • 是的,我同意 Kazi Tanvir Ahsan.. 但我对如何应用 Peterm 解决方案有点困惑

标签: mysql sql


【解决方案1】:

你可以这样做

SELECT t.id, itemname, category
  FROM
(
  SELECT 
  (
    SELECT id
      FROM table1
     WHERE category = t.category
     ORDER BY RAND()
     LIMIT 1
  ) id
    FROM table1 t
   GROUP BY category
) q JOIN table1 t
    ON q.id = t.id

注意:使用RAND() 非常昂贵

输出:

|身份证 |项目名称 |类别 | |----|---------|----------| | 1 |项目 A | 1 类 | | 3 |项目 C | 2 类 | | 6 |项目 F | 3 类 |

这里是SQLFiddle演示

【讨论】:

  • 嗨彼得姆,这看起来很棒!我会尝试这个并稍后发布更新。非常感谢!
  • 太棒了!即使没有加入第二张桌子,它也很有魅力。
【解决方案2】:

试试这样的:

SELECT id, itemname, category FROM (
  SELECT id, itemname, category FROM sample_table 
  ORDER BY RAND()
) AS tmp
GROUP BY category

请注意,这个查询在 MySQL 中是完全有效的 http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html

【讨论】:

【解决方案3】:

最安全的方法是使用相关子查询。获取item_id

select category,
       (select item_id from sample s where s2.category = s.category order by rand() limit 1) as item_id
from sample s
group by category;

要获取其余项目信息,请重新加入:

select s.*
from (select category,
             (select item_id from sample s where s2.category = s.category order by rand() limit 1) as item_id
      from sample s
      group by category
     ) c join
     sample s
     on s.item_id = c.item_id;

【讨论】:

  • 嗨,我认为这也可以,但是我想坚持使用 Peterm 解决方案。还是谢谢
【解决方案4】:

在上面编辑的场景之前,我使用了以下查询,它工作正常,只是它不会随机化每个类别的条目:

SELECT * FROM Table1,Table2
WHERE Table2.Class = '1'
 AND Table1.Category = Table2.Category
GROUP BY Table1.Category ORDER BY RAND()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    相关资源
    最近更新 更多