2015-10-31 2 views
-1

после нескольких часов попыток, я думал, что прошу вас здесь помочь. Моя проблема заключается в следующем:MySQL заказываю до группы плюс плюс присоединяется после этого

У меня есть две таблицы. Одна таблица содержит общие данные о событиях, а вторая таблица содержит отдельные события, относящиеся к общей таблице (может быть несколько отдельных событий, относящихся к одной общей строке событий).

структура выглядит следующим образом:

1. Общие события таблицы "событий ":

id | club_id | date_created | description | imageLink | .... 

2. Одноразовый событий стол:" events_single"

id | events_id (id from events table) | valid_from | valid_until 

Все временные метки являются временными отметками unix

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

Сформировать ссылку мне удалось получить ближайшие отдельные события для всех клубов: MySQL order by before group by

Запрос выглядит следующим образом:

SELECT p1 . * 
FROM events_single p1 
INNER JOIN (
    SELECT min(valid_from) AS firstEvent, events_id 
    FROM events_single 
    WHERE events_single.valid_from >= UNIX_TIMESTAMP() 
    GROUP BY events_id 
)p3 ON p1.events_id = p3.events_id 
    AND p1.valid_from = p3.firstEvent 
    ORDER BY p1.valid_from ASC 

Это возвращает, например:

id |events_id |valid_from|valid_until 
4 |1   |1446706800|1446793200 
39 |7   |1446966000|1447052400 
14 |4   |1447311600|1447398000 

Проблема в том, что теперь мне нужно снова присоединиться к этой таблице с таблицей событий, чтобы получить только отдельные события для определенного clu б.

E.g. если общая таблица событий является

id | club_id | date_created | .... 
1 | 1   | 1446793200 | .... <------    
2 | 2   | 1456793235 | ....    
3 | 5   | 1458735234 | .... 
4 | 1   | 1458783425 | .... <------  
5 | 2   | 1458953256 | .... 
6 | 4   | 1461983283 | .... 
7 | 5   | 1461993452 | .... 

, и я хочу, чтобы получить сейчас все одиночные события для club_id = 1 и должен возвращать обе таблицы присоединились:

id |events_id |valid_from|valid_until|club_id  | date_created | .... 
4 |1   |1446706800|1446793200 |1   | 1446793200 | .... 
14 |4   |1447311600|1447398000 |1   | 1458783425 | .... 

Я попробовал следующий запрос:

SELECT p1.*, p2.* 
FROM events_single p1, events p2 
INNER JOIN (
    SELECT min(valid_from) AS firstEvent, events_id 
    FROM events_single 
    WHERE events_single.valid_from >= UNIX_TIMESTAMP() 
    GROUP BY events_id 
)p3 ON p1.events_id = p3.events_id 
    AND p1.valid_from = p3.firstEvent 
    WHERE p2.club_id = 1 
    ORDER BY p1.valid_from ASC 

но я получаю сообщение об ошибке:

#1054 - Unknown column 'p1.events_id' in 'on clause' 

Если я заменю 'p1.events_id' с 'events_single.events_id' Я получаю ту же ошибку.

Почему? Или лучший вопрос: какой правильный запрос?

Большое спасибо!

+1

попробовать это:. 'ВЫБРАТЬ p1 *, p2 * ИЗ events_single p1 внутреннее объединение событий p2 ON p1.events_id = p2.id. WHERE p2.club_id = 1 и p1.valid_from> = UNIX_TIMESTAMP() ORDER BY p1.valid_from ASC' –

+0

Почему вам нужно 'min (valid_from)'. –

+1

* Из следующей ссылки мне удалось получить ближайшие одиночные события для всех клубов * Ум, нет, вы этого не сделали! ??! – Strawberry

ответ

1

Кажется, вам нужно снова присоединиться к таблице событий. Другими способами псевдоним p1 не отображается в разделе ON, поскольку вы снова добавляли события p2. Попробуйте этот запрос, как показано ниже, в котором будет исправлена ​​ваша проблема.

SELECT p1.*, p2.* 
FROM events_single p1 
INNER JOIN (
    SELECT min(valid_from) AS firstEvent, events_id 
    FROM events_single 
    WHERE events_single.valid_from >= UNIX_TIMESTAMP() 
    GROUP BY events_id 
)p3 ON (p1.events_id = p3.events_id 
    AND p1.valid_from = p3.firstEvent) 
INNER JOIN 
events p2 ON (p2.id = p3.event_id) 
    WHERE p2.club_id = 1 
    ORDER BY p1.valid_from ASC 

Мы можем оптимизировать выше запрос следующим образом

SELECT events.*, es_tmp.* 
    FROM events 
    INNER JOIN (
     SELECT min(valid_from) AS firstEvent, events_id 
     FROM events_single 
     WHERE events_single.valid_from >= UNIX_TIMESTAMP() 
     GROUP BY events_id 
    )es_tmp ON (events.id = es_tmp.events_id) 
    WHERE events.club_id = 1 
     ORDER BY es_tmp.firstEvent ASC 
+0

Привет, Шанкар, большое вам спасибо за ваши усилия! К сожалению, ваши запросы не работают. Первый запрос возвращает, что на последней части есть ошибка SQL «INNER JOIN events p2 (p2.id ....). Второй запрос говорит, что в последней строке кода ORDER BY es_tmp.valid_from« es_tmp.valid_from » неизвестно. –

+0

Привет, SF Я не тестировал запрос, так как я не создаю схему. Будет ли обновлять запросы после создания подобной структуры, не могли бы вы поделиться, если вы используете вашу схему в http://sqlfiddle.com/ – Shankar

+0

@SF Я обновил второй запрос, попробуйте еще раз в вашей схеме один раз? Не могли бы вы опубликовать всю ошибку, мне было бы легко отлаживать? – Shankar

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