アレックスtoader:
私はアイテムをTABLEXを持っており、各項目はCATEGORY_IDと評価しています。私は、各カテゴリフォーム最高の格付けを持つ項目を取りたいです。
私は、私のような何かをしなければならないと想像します
SELECT DISTINCT category_id from tableX;
その後のような別のクエリでのforeachにそれらの結果を実行します
SELECT * from tableX where category_id = ${1} ORDER BY rating, LIMIT 1;
か何かのように
call foreach('SELECT distinct category_id FROM tableX', 'SELECT * from tableX WHERE category_id = ${1} ORDER BY rating DESC LIMIT 1')
編集:
私はいくつかの行の例を追加しました
CREATE TABLE `tableX` (
`id` bigint(20) UNSIGNED NOT NULL,
`rating` double(6,1) DEFAULT '0.0',
`category_id` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
テーブルのデータをダンプ tableX
INSERT INTO `tableX` (`id`, `rating`, `category_id`) VALUES
(1463, 8.0, 1),
(1464, 8.0, 1),
(1465, 8.0, 1),
(1466, 9.0, 1),
(1467, 9.0, 1),
(1468, 3.0, 1),
(1469, 8.0, 1),
(1470, 2.0, 1),
(1471, 4.0, 1),
(1472, 9.0, 1),
(1473, 5.0, 1),
(1474, 9.0, 1),
(1475, 10.0, 1),
(1476, 7.0, 1),
(1477, 7.0, 1),
(1478, 6.0, 1),
(1479, 10.0, 1),
(1480, 3.0, 1),
(1481, 7.0, 1),
(1482, 4.0, 1),
(1483, 7.0, 1),
(1484, 4.0, 1),
(1485, 2.0, 1),
(1486, 4.0, 1),
(1487, 5.0, 1),
(1488, 9.0, 1),
(1489, 8.0, 1),
(1490, 7.0, 1),
(1491, 10.0, 1),
(1492, 9.0, 1),
(1493, 9.0, 1),
(1494, 9.0, 2),
(1495, 3.0, 2),
(1496, 9.0, 2),
(1497, 9.0, 2),
(1498, 2.0, 2),
(1499, 4.0, 2),
(1500, 5.0, 2),
(1501, 7.0, 2),
(1502, 5.0, 2),
(1503, 7.0, 2),
(1504, 10.0, 2),
(1505, 6.0, 2),
(1506, 6.0, 4),
(1507, 1.0, 4),
(1508, 5.0, 4),
(1509, 7.0, 5),
(1510, 4.0, 5);
ダンプテーブルのインデックス
ALTER TABLE `tableX`
ADD PRIMARY KEY (`id`),
ADD KEY `category_id` (`category_id`);
ゴードン・リノフ:
使用しますrank()
かrow_number()
:
select x.*
from (select x.*,
row_number() over (partition by category_id order by rating desc) as seqnum
from tableX x
) x
where seqnum = 1;
絆のために、使用rank()
(最高の評価を持つすべての行です)。
MySQLの8+で作品以上という。以前のバージョンでは、相関サブクエリを使用することができます。何かのようなもの:
select x.*
from tableX x
where x.rating = (select max(x2.rating)
from tableX x2
where x2.category_id = x.category_id
);
あなただけの1行、その後、第二の形式を使用してをしたい場合:
select x.*
from tableX x
where x.id = (select x2.id
from tableX x2
where x2.category_id = x.category_id
order by x2.rating desc
limit 1
);