最常见商品的MYSQL选择查询?

5
我需要帮助找出如何仅显示每个分店中最常见的产品。这适用于数据库中的每个分店。
附注:这是在单个表格中完成的(不需要其他表格来实现),只需要两个属性。

1
请不要使用mysql。请改用mysqli或PDO。 - Sid
4
@Sid,在这里OP使用了PHP吗?是的,那些是PHP的库,但我找不到MySQLi Server或PDO Server!只是在讽刺 - Praveen Kumar Purushothaman
2个回答

1

基于Sean的数据库样例,我创建了查询,这可以完成任务,但请注意您在应用程序中的方式看起来资源昂贵。尝试思考另一种发现最常见产品的方法,而不是数据库查询。

SELECT 
    a.branch_id, `branch_product` , COUNT(branch_product) AS cnt , b.mx
FROM 
    branch_products a 
LEFT JOIN 
    (SELECT 
        branch_id, MAX(cnt) AS mx 
     FROM 
        (SELECT branch_id, COUNT(branch_product) AS cnt FROM branch_products GROUP BY branch_id, branch_product ) AS maxes 
     GROUP BY branch_id) b 
ON a.branch_id = b.branch_id
GROUP BY branch_id, branch_product
HAVING cnt=mx

除了数据库查询,你还提出了什么?如果数据在数据库中,那就使用查询来获取数据! - Sean
这强烈依赖于应用程序架构。这可能是一种预索引、内存缓存的方式。即使是一个包含预计算项目数量的附加表也会使其更快。虽然这个查询很有效,但在大量数据上会相当慢,并且很难构建出更好的东西来实时计算值。 - Alexander Taver

0
将计数放在子查询中,按计数降序排序,然后在该子查询之外按分支 ID 进行分组:
SELECT * FROM (
    SELECT *, count(branch_product) AS cou FROM branch_products
    GROUP BY branch_id, branch_product
    ORDER BY cou DESC
) AS ordbycou
GROUP BY branch_id

生成:

+-----------+----------------+-----+
| branch_id | branch_product | cou |
+-----------+----------------+-----+
|         1 | trainers       |   3 |
|         2 | suit           |   2 |
|         3 | suit           |   1 |
+-----------+----------------+-----+
3 rows in set (0.00 sec)

这是一个示例表格,可用于尝试上述查询:
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
CREATE TABLE IF NOT EXISTS `branch_products` (
  `branch_id` mediumint(8) unsigned NOT NULL,
  `branch_product` varchar(128) NOT NULL,
  KEY `branch_id` (`branch_id`),
  KEY `branch_product` (`branch_product`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
INSERT INTO `branch_products` (`branch_id`, `branch_product`) VALUES
(1, 'trainers'),
(1, 'trainers'),
(1, 'trainers'),
(1, 'tie'),
(1, 'tie'),
(1, 'suit'),
(2, 'suit'),
(2, 'suit'),
(2, 'tie'),
(3, 'suit');

@AvinVarghese 从未听说过sqlfiddle,那是一个相当不错的网站。感谢您分享链接! - Sean
很遗憾,这并没有回答我的问题。如果分支编号1有产品培训师和领带出现的次数相同,那么分支编号1将拥有培训师和领带,尽管它们在不同的行中。所以,在一列中是BranchNo 1,在另一列中是产品:培训师,再加上领带。如果我没有解释清楚,请尝试使用您给我的fiddle,并仅在分支1中同时出现培训师和领带的数据。例如:(1, 'trainers'), (1, 'tie'),结果应该会产生它们两个,因为它们出现的次数相同。 - Martynogea
@Martynogea,你从未说明如果分支机构的计数相等,则需要显示多个产品。在这种情况下,可以尝试执行一个子查询来查找每个分支机构的最高计数,然后在第二个子查询中获取所有计数等于该最高计数的产品。 - Sean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接