Полуразличный MySQL Query - PullRequest
1 голос
/ 25 марта 2009

У меня есть таблица MySQL с именем items, которая содержит тысячи записей. Каждая запись имеет поле user_id и поле created (datetime).

Попытка собрать запрос в SELECT 25 строк, передавая строку пользовательских идентификаторов в качестве условия и отсортировав по created DESC.

В некоторых случаях может быть только несколько пользовательских идентификаторов, в то время как в других случаях они могут быть сотнями.

Если результирующий набор больше 25, я хочу сократить его, удалив дубликаты user_id записей. Например, если для user_id = 3 существует две записи, будет включена только самая последняя (согласно created datetime).

В моих попытках найти решение у меня возникают проблемы, потому что, например, легко получить набор результатов из 100 (допускающий дублирование user_id записей) или набор результатов из 16 (используя GROUP BY для уникальные user_id записи), сложно получить 25.

Один логический подход, который может не быть правильным подходом MySQL, состоит в том, чтобы получить самую последнюю запись для каждого для каждого user_id, а затем, если набор результатов меньше 25, начать добавлять вторую запись для каждого user_id до тех пор, пока не будет достигнут предел в 25 записей (может потребоваться третья, четвертая и т. Д. Запись для каждого user_id).

Можно ли это сделать с помощью запроса MySQL или мне нужно взять большой набор результатов и сократить его до 25 с помощью кода?

Ответы [ 5 ]

1 голос
/ 25 марта 2009

К сожалению, не существует простого способа :( Мне пришлось сделать нечто подобное, когда я создавал отчет для своей компании, который бы проверял отключения клиентов, которые были зарегистрированы в базе данных. Единственная проблема заключалась в том, что отключение запускалось и регистрировалось каждый раз. 30 минут. Поэтому строки не будут различаться, так как временная метка была разной в каждом разъединении. Я решил эту проблему с помощью подзапросов. У меня больше нет точного кода, но я полагаю, что именно так я его реализовал:

SELECT CORP, HOUSE, CUST, 
    (
        SELECT TOP 1 hsd
        FROM #TempTable t2
        WHERE t1.corp = t2.corp
        AND t1.house = t2.house
        AND t1.cust = t2.cust
    ) DisableDate
FROM #TempTable t1
GROUP BY corp, house, cust -- selecting distinct

Итак, мой ответ состоит в том, чтобы вычленить неотличимый столбец из запроса, используя подзапросы. Там может быть более простой способ сделать это, хотя. Мне любопытно посмотреть, что пишут другие.

Извините, я продолжаю редактировать это, я пытаюсь найти способы, чтобы упростить показ того, что я сделал.

1 голос
/ 25 марта 2009

Один из подходов состоит в том, чтобы получить самый последний элемент от каждого пользователя, затем самые последние элементы от всех пользователей и ограничить его. Вы могли бы построить патологические примеры, где это, вероятно, не то, что вы хотите, но в целом это должно быть довольно хорошо.

1 голос
/ 25 марта 2009

Это даст вам самую последнюю версию для каждого пользователя -

ВЫБЕРИТЕ user_id, создайте
ИЗ элементов КАК i1
ЛЕВЫЕ СОЕДИНЯЙТЕСЬ, КАК i2
ON i1.user_id = i2.user_id AND i1.create> i2.create
ГДЕ i2.id NULL

Его вы получите две последние записи для каждого пользователя -

ВЫБЕРИТЕ user_id, создайте
ИЗ элементов КАК i1
ЛЕВЫЕ СОЕДИНЕНИЯ ON i1.user_id = i2.user_id AND i1.create> i2.create
ЛЕВЫЕ СОЕДИНЯЕМЫЕ товары - это i3 ON i2.user_id = i3.user_id AND i2.create> i3.create
ГДЕ i3.id НЕДЕЙСТВИТЕЛЕН

Попробуйте работать оттуда.

Вы могли бы приятно поместить это в хранимую процедуру.

1 голос
/ 25 марта 2009

Мое мнение состоит в том, чтобы использовать логику приложения, поскольку это очень большая логика прикладного уровня, которую вы пытаетесь реализовать на уровне БД, то есть фильтрация результатов, чтобы сделать поиск более полезным для конечного пользователя.

Вы можете реализовать хранимую процедуру (лично я бы никогда не сделал этого) или просто заставить приложение решить, какие 25 результатов.

1 голос
/ 25 марта 2009

Я не думаю, что то, что вы пытаетесь выполнить, возможно в виде SQL-запроса. Вы хотите вернуть 25 строк, независимо от того, каковы нормальные группировки данных, тогда как SQL обычно требователен к возврату на основе группировки данных.

Если вам нужно решение на основе исключительно MySQL, вы можете выполнить это с помощью хранимой процедуры. (Поддерживается в MySQL 5.0.x и более поздних версиях.) Однако, может быть, имеет смысл выполнить запрос, чтобы вернуть все более 100 строк, а затем программно обрезать его внутри приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...