2016-03-02 7 views
2

Вот Fiddle: SQLFIDDLEзаказа, используя подзапрос и группировка

Если вы посмотрите на мой подзапроса я select location ids and order them by the sort column. Я хочу, чтобы мой конечный результат был заказан по расположению моих локалей, выбранных мной в моем подзапросе. Так, например, у него должны быть отзывы о местоположении 3166, затем местоположение 269, затем местоположение 3572 INSTEAD of it's current results.

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

Таким образом, для окончательного набора результатов, я должен получить (в указанном порядке):

  • отзывы строка 16

  • отзывы строка 19

  • отзывы строка 24

Этот результат удовлетворяет следующим требованиям rements (в порядке):

  • Сортировано флагом сортировки в таблице местоположений

  • Получено самый текущий обзор на основе отсортированного расположения

Спасибо за помощь. Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать.

UPDATE

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

ВТОРАЯ UPDATE

Я начал пытаться с помощью внутреннего соединения, но я не могу получить запись с наибольшим createdate для отображения. SQLFIDDLE TWO

+2

Ваш sqlfiddle не загружается .. – user2407394

+0

@ user2407394 Интересно. Кажется, мне очень нравится. Попробуйте дождаться ошибок, а затем повторите попытку. – slicks1

+0

SQLFiddle нестабилен. Это не ссылка. –

ответ

0

Edit: После получения ясности о том, что столбец сортировки был для .... Это должно быть то, что вы ищете: sqlfiddle.com/#!9/ fa15b/9

SELECT r.reviewid, r.locid, r.title, r.createdate, l.sort 
FROM reviews r 
INNER JOIN locations l ON l.locid = r.locid 
WHERE r.reviewid IN 
    (SELECT MAX(r2.reviewid) FROM reviews r2 
     GROUP BY r2.locid) 
ORDER BY l.sort 

Объяснение; Я попытаюсь объяснить это как можно тщательнее, так что, если кто-то еще сталкивается с этим, это имеет смысл.

Давайте начнем с того, что мы «потребность» из этого запроса:

  • все места, которые имеют отзывы
  • для элементов, которые будут отсортированы по «сорта», из таблицы местоположений
  • верхней (то есть самый последний) обзор (из таблицы отзывов) для каждого места

Мы решать их по одному за раз:

  1. Присоединение к местам, у которых есть обзоры, так же просто, как кажется. Мы запускаем SQL JOIN между отзывами и местоположениями на ключевом «locid», предоставляя нам результирующий набор только для тех мест, в которых есть отзывы (и наоборот)

  2. Следующее, что вам нужно сделать, это сортировать по вашим «сортировкам», колонка. Следовательно, «ORDER BY l.sort». Это оставляет нам полный список всех обзоров/местоположений.

  3. Последний элемент - выбрать только самый последний обзор для каждого местоположения. Так как reviewid's являются номерами в порядке возрастания, результат выбора даты по сравнению с идентификатором обзора одинаковый, и reviewid мне легче.

    • Здесь находится подзапрос; Я хочу получить список самых последних обзоров (прочитайте: первичный ключ с наивысшим значением) для каждого местоположения.
    • Я выбираю MAX (r2.reviewid) с использованием другого псевдонима из обзоров, чтобы сравнить его с исходным списком (r1). Обратите внимание, что если я оставил MAX() здесь без группировки, я бы получил только самый высокий обзор из всех обзоров (6, я думаю, в примере?)
    • Почти закончено, мы группируем подзапрос r2.locid чтобы возвращать для каждого отдельного объекта наивысший пронумерованный обзор.
  4. Заключительная часть этой головоломки должна ссылаться на reviewid из подзапроса, так что мы получаем только максимальный id, которого хотим; затем введите в зависимости от того, какие столбцы вы хотите в инструкции SELECT.

Дополнительные примечания:

  • Мы не хотим локаций без отзывов
  • Мы не хотим кратные любого места
  • Я мог бы также сделать автообъединение, используя ту же логику, вместо подзапрос, но я понял, что предложение WHERE было легче понять.
  • Если вам по какой-то причине нужны местоположения, в которые не включены какие-либо обзоры, вам нужно будет использовать какую-то странную логику RIGHT JOIN.
  • Вы должны реализовать предыдущие два элемента в качестве упражнения.
+0

Код У меня выше работает для вашего конкретного примера, но я думаю, что мне не хватает точки столбца сортировки, потому что у нас есть только 3 записи. Если вам действительно нужен столбец сортировки для участия, вам потребуется соединение. – goodguy5

+0

столбец сортировки - это числовое значение его сортировки. Так, например, если мы сортируем по сортировочному столбцу 3166, чтобы быть первым в моем результирующем наборе, вторым будет местоположение 269, а затем 3572 для последнего местоположения – slicks1

+0

@ slicks1, тогда да, вам обязательно нужно будет присоединиться. Я посмотрю еще немного, если никто не ответит к тому времени, когда я доберусь до него. Является ли сортировка уникальной колонкой? – goodguy5

0

select * совершенно неприемлем при использовании group by. Агрегирующие запросы должны иметь функции агрегации.

Общий ответ на ваш вопрос - использовать join. Образец такой запрос выглядит следующим образом:!

select r.locid, count(*), max(r.createdate) 
from reviews r join 
    locations l 
    on r.locid = l.locid 
group by locid 
order by sort; 
+0

OK Теперь мне нужно сделать второй заказ по самому последнему обзору, который будет представлять отзывы убывание. Я попытался добавить предложение второго порядка, но, похоже, для этого были записаны записи 1,2,3 вместо 16,19,24 в следующем порядке: http://sqlfiddle.com/#!9/4cb5c/34/0 – slicks1

Смежные вопросы