Как сгруппировать данные по координатам X и Y в запросе?

#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, хе-хе.