2016-04-20 6 views
1

Это действительно странно, я пытался это решить уже довольно давно. Я искал высоко и низко для ответа на этот вопрос, и я просто не могу его найти. Я застрял, и был бы очень признателен, если бы кто-то помог мне здесь.MySQL Group By and Order Используется вместе

Прежде всего, для этого я создал SQL-скрипт. Это просто так трудно для меня, чтобы объяснить это, и я чувствовал, что это лучший способ для людей, чтобы получить представление о моих схемах и данных: http://www.sqlfiddle.com/#!9/f5da89/3

Итак, вот что я пытаюсь сделать:

  • Выберите строки из wp_bbpas, которые не старше 24 часов
  • Регистрация данных у меня есть на wp_users стол, так что я могу получить имена пользователей и такие
  • Возвращенные данные

Что на самом деле происходит, это выбор максимального количества date_recorded для каждой строки (это то, что я хочу, так как могут быть сотни из них возвращены на каждый запрос), затем он возвращает то, что кажется правильными данными, однако при ближайшем рассмотрении (используя индексные клавиши), вы увидите, что он полностью смешивает содержимое. (id 334 имеет другой номер date_recorded, на который был возвращен)

Я использую функцию GROUP BY здесь? Может ли кто-нибудь указать, что я сделал здесь неправильно?

Благодаря

+2

Вы злоупотребляя 'функциональность GROUP BY'. У вас есть столбцы в 'SELECT', которые не являются аргументами функций агрегации и не входят в предложение GROUP BY. –

ответ

2

вы должны использовать подвыбор как этот

SELECT p.date_recorded as date_recorded, p.id, p.userid, p.status, w.user_nicename, w.user_login, w.display_name 
FROM wp_bbpas AS p 
JOIN wp_users AS w ON w.id = p.userid 
WHERE date_recorded >= NOW() - INTERVAL 24 HOUR 
and (p.userid, p.date_recorded) in ( select userid, MAX(date_recorded) 
         from wp_bbpas group by userid) 
ORDER BY date_recorded DESC 
+0

Это прекрасно работает, теперь моя забота о производительности. Смотрите, у меня было это как решение, но этот запрос слишком долго работал с более крупными наборами данных (занял около 2 секунд примерно для 20 строк). –

+0

есть ли у вас нужный индекс, где это необходимо? ... 20 строк для результата ... но сколько строк для wp_users и wp_bbpas? – scaisEdge

+0

'wp_users' имеет около 140 строк,' wp_bbpas' имеет около 350. Это может расти экспоненциально, однако оператор where должен резко сократить это. Поскольку я работаю с схемой WordPress для 'wp_users', я не могу контролировать индексы там ... однако все выглядит нормально, а в' wp_bbpas' у меня есть id, userid и date_recorded indexed –

1

Это один возвращает то, что вы ожидали, не так ли?

SELECT p.date_recorded, p.id, p.userid, p.status, w.user_nicename, w.user_login, w.display_name 
FROM wp_bbpas AS p 
JOIN wp_users AS w ON w.id = p.userid 
WHERE date_recorded >= NOW() - INTERVAL 24 HOUR 
GROUP BY p.userId 
ORDER BY date_recorded DESC 

(Вам не нужно max(date_recorded) как данные упорядочены по этому полю)

+0

Только проблема с этим решением заключается в том, что он не возвращает самые последние строки –