#mysql
#mysql
Вопрос:
У меня есть такая таблица:
| X | Y | Data |
----------------
| 1 | 2 | Hi |
| 3 | 4 | Hey |
| 1 | 2 | New! |
| 1 | 2 | New! |
| 1 | 2 | New! |
Небольшая предыстория:
Я пытаюсь создать таблицу (HTML), используя координаты, указанные в моей таблице, с данными в теле ячейки. Поскольку данные не получены мной лично, а поступают от самих пользователей (скрипт Grease Monkey извлекает данные с сайта), мне нужно сгруппировать данные по X
, а Y
затем сгруппировать по Data
столбцу и выбрать наиболее часто встречающийся.Это делается для того, чтобы я получал достоверные данные, поскольку они могут подделывать данные, и я ничего не могу с этим поделать.
Проблема заключается в поиске запроса select, который создаст какой-то массив, подобный следующему из приведенной выше таблицы.
Array (
[0] = Array (
'x' => 1,
'y' => 2,
'Data' => "New!"
)
[1] = Array (
'x' => 3,
'y' => 4,
'Data' => "Hey"
)
)
Я попробовал несколько вариантов, но ни один из них не сработал, поэтому я проверяю здесь, чтобы узнать, может ли кто-нибудь пролить свет на мою проблему.
Спасибо!
Комментарии:
1. Что должно произойти, если существует связь между двумя одинаково частыми
Data
для одной и той же координаты.2. Извините, я не видел этого комментария здесь. Честно говоря, я предполагаю, что только самые законные будут вверху, поскольку я не ожидаю, что пользователь будет настолько злонамеренным, чтобы заставить группу людей отправлять одни и те же неправильные данные. Поэтому я не возражаю, если он просто выберет случайный верхний, если он связан, потому что я не думаю, что это когда-нибудь дойдет до этого.
Ответ №1:
Это работает для вас?
SELECT T3.X, T3.Y, MAX(T3.Data) AS Data
FROM
(
SELECT X, Y, MAX(cnt) AS max_cnt
FROM
(
SELECT X, Y, Data, COUNT(*) AS cnt
FROM yourtable
GROUP BY X, Y, Data
) T1
GROUP BY X, Y
) T2
JOIN
(
SELECT X, Y, Data, COUNT(*) AS cnt
FROM yourtable
GROUP BY X, Y, Data
) T3
ON T2.X = T3.X AND T2.Y = T3.Y AND T2.max_cnt = T3.cnt
GROUP BY T3.X, T3.Y
Вы также можете рассмотреть возможность создания представления:
CREATE VIEW yourtable_counts AS
SELECT X, Y, Data, COUNT(*) AS cnt
FROM yourtable
GROUP BY X, Y, Data
Затем вы можете упростить запрос:
SELECT T3.X, T3.Y, MAX(T3.Data) AS Data
FROM
(
SELECT X, Y, MAX(cnt) AS max_cnt
FROM yourtable_counts T1
GROUP BY X, Y
) T2
JOIN yourtable_counts T3
ON T2.X = T3.X AND T2.Y = T3.Y AND T2.max_cnt = T3.cnt
GROUP BY T3.X, T3.Y
Комментарии:
1. Вау, спасибо за быстрый ответ и подробности. Я уверен, что все работает отлично. Если нет, я добавлю редактирование. Я думаю, что я создам представление и сделаю это таким образом, по крайней мере, мой скрипт не будет загроможден SQL, хе-хе.