У меня есть стол,
| PAGELETS | CREATE TABLE `PAGELETS` (
`page_key` int(32) unsigned NOT NULL,
`pagelet_serial` int(32) unsigned NOT NULL,
`pagelet_shingle` int(32) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Я бы хотел:
1) Find all the pagelet_shingles where quantity > 1 ( occurs more than once)
2) out of these only output those that have different page_key
Это запрос, который дает полу-правильный ответ:
SELECT * FROM PAGELETS WHERE pagelet_shingle IN( SELECT pagelet_shingle FROM PAGELETS GROUP BY pagelet_shingle HAVING COUNT(DISTINCT page_key) > 1) ORDER BY pagelet_shingle;
К сожалению, для небольшого набора данных это занимает около 18 секунд;
У меня есть другой запрос,
SELECT dt1.* FROM
(SELECT * FROM PAGELETS
GROUP BY page_key, pagelet_shingle HAVING COUNT(*) = 1)
dt1 JOIN
(SELECT * FROM PAGELETS GROUP BY pagelet_shingle HAVING COUNT(*) > 1)
dt2 USING (pagelet_shingle) ORDER BY pagelet_shingle
дано экспертом, который технически не корректен (что-то с вами не может ВЫБРАТЬ * .. ГРУППА), но дает результаты НАМНОГО быстрее, в случае
ВЫБРАТЬ * ИЗ ПАГЕТЕРОВ, ГДЕ pagelet_shingle = 57
+----------+----------------+-----------------+
| page_key | pagelet_serial | pagelet_shingle |
+----------+----------------+-----------------+
| 1 | 99 | 57 |
| 1 | 99 | 57 |
| 2 | 228 | 57 |
| 2 | 228 | 57 |
+----------+----------------+-----------------+
Полукорректный запрос дает
+----------+----------------+-----------------+
| page_key | pagelet_serial | pagelet_shingle |
+----------+----------------+-----------------+
| 1 | 99 | 57 |
| 1 | 99 | 57 |
| 2 | 228 | 57 |
| 2 | 228 | 57 |
+----------+----------------+-----------------+
Хотя в неправильном запросе нет набора pagelet_shingle = 57
Мой желаемый результат -
+----------+----------------+-----------------+
| page_key | pagelet_serial | pagelet_shingle |
+----------+----------------+-----------------+
| 1 | 99 | 57 |
| 2 | 228 | 57 |
+----------+----------------+-----------------+
Каждый случай только один раз.
a pagelet_shingle, встречающийся дважды в одном и том же pagelet_serial, будет опущен.
Так что я хотел бы спросить следующее:
1) Есть ли способ ускорить csemi orrect запрос, чтобы достичь скорости неправильного
2) или есть способ исправить неправильный, чтобы получить результат правильного (меня не волнует строгость)