5

各ブランチで最も頻繁に使用される製品のみを表示する方法を見つけるのに助けが必要です。

これは、DB の各ブランチに適用されます。

PS: これは 1 つのテーブルで行われ (このパフォーマンスには他のテーブルは必要ありません)、前述の 2 つの属性のみが必要です。

4

2 に答える 2

1

Sean の DB サンプルに基づいて、ジョブを実行するクエリを作成しましたが、アプリケーションで行っている方法ではリソースが高価に見えることに注意してください。DB クエリではなく、最も頻繁に使用される商品を見つける別の方法を考えてみてください。

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
于 2012-12-04T10:13:32.260 に答える
0

カウントをサブクエリ内に配置し、ORDER BYカウントDESCを入力してから、そのサブクエリの外部にあるGROUPBYブランチ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');
于 2012-12-02T05:51:45.813 に答える