Как заказать по результату подзапроса - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть 2 таблицы БД, Events и Event_Dates, поэтому каждое событие может иметь несколько дат.Сейчас я пытаюсь зачитать следующее предстоящее событие и список всех предстоящих событий, упорядоченных по дате.

Итак, я создал следующий запрос с подзапросом, но порядок по нему игнорируется.После некоторого исследования я понял, что это распространено, но я все еще не уверен, как обойти это.Может ли кто-нибудь дать мне подсказку?

Моя Event Таблица содержит информацию о событиях, такую ​​как Location, Event name и Description.В таблице Event_Dates хранятся даты event_id и одна или несколько дат, если событие продолжается более 1 дня.I

f Я просто проверяю свой подзапрос, затем получаю правильный порядок по event_date, но основной запрос игнорирует этот порядок по event_dates.Поэтому, если в моей таблице дат событий указано следующее:

id | event_id | event_date
1  | 58 | 2019-02-23
2  | 59 | 2019-02-24
3  | 60 | 2019-02-09 

Подзапрос возвращает 60, 58, 59, что является правильным, поэтому я хотел бы отображать события в таком порядке, новместо этого он показывает 58, 59, 60.

Select * FROM events WHERE id in(
 select event_id from event_dates 
    where event_date >= NOW() order by ABS(DATEDIFF(NOW(),event_date))
)

ОБНОВЛЕНИЕ-

Отличная и быстрая помощь дала мне решение, и вот как это должно выглядеть в Laravel:

         $events = Event::select('events.*')
                ->distinct('events.id')
                ->join('event_dates','event_dates.event_id','=','events.id')
                ->where('event_date', '>=', \DB::raw('curdate()'))  
                ->where('published',1)    
                ->orderBy('event_dates.event_date')   
                ->get();

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

У вас есть повторяющиеся события.Событие может происходить многократно в прошлом и может происходить многократно в будущем.Вы хотите показать будущие события, упорядоченные по дате.Это просто внутреннее соединение:

select e.*
from events e 
join event_dates ed on ed.event_id = e.id and ed.event_date >= now()
order by ed.event_date;

С событиями Рождества и Пасхи на 2017, 2018, 2019, 2020 годы вы получите:

Easter
Christmas
Easter
Christmas
0 голосов
/ 09 февраля 2019

Мне кажется, что вам просто нужно JOIN между двумя таблицами, правильно отфильтрованными и отсортированными:

SELECT e.*, d.*
FROM events e
INNER JOIN event_dates d ON d.event_id = e.event_id AND d.event_date >= NOW()
ORDER BY d.event_date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...