2015-05-04 5 views
0

Я пытаюсь сделать INNER JOIN по двум запросам. Если у меня есть широкий оператор SELECT для первого компонента, он отлично работает. Если я попытаюсь добавить WHERE ... к первому компоненту, я получаю неинформативную ошибку синтаксиса, и я не знаю почему.SELECT * FROM mytable INNER JOIN и т. Д. Ok, но SELECT * FROM mytable WHERE ... INNER JOIN error

Это то, что работает, но медленно, потому что мой стол большой (~ 1mil строк)

SELECT a.RoomNum, a.EventName, a.EventStatus, a.EventDateTime FROM eventtable a 
INNER JOIN 
(
    SELECT `RoomNum`, eventname, MAX(`EventDateTime`) as MT 
    FROM `eventtable` 
    WHERE eventname = "DND" 
    Group BY RoomNum 
) b 
ON a.RoomNum = b.RoomNum and a.EventDateTime = b.MT and a.eventname = b.eventname 

Но что мне действительно нужно:

SELECT a.RoomNum, a.EventName, a.EventStatus, a.EventDateTime from eventtable WHERE a.EventName = "DND" a 
INNER JOIN 
(
    SELECT `RoomNum`, eventname, MAX(`EventDateTime`) as MT 
    FROM `eventtable` 
    where eventname = "DND" 
    Group by RoomNum 
) b 
on a.RoomNum = b.RoomNum and a.EventDateTime = b.MT and a.eventname = b.eventname 

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

Спасибо.

+0

Какая неинформативная ошибка синтаксиса? –

+0

Все соединения всегда должны быть перед любым утверждением – Capsule

+0

@scrowler Неинформативная синтаксическая ошибка: «# 1064 - У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса, name = "DND" INNER JOIN (SELECT 'RoomNum', eventname, MAX (' EventDateTime') как M 'в строке 1 " – janson

ответ

0

Ваш запрос должен быть

SELECT a.RoomNum, a.EventName, a.EventStatus, a.EventDateTime from eventtable a 
INNER JOIN 
(
    SELECT `RoomNum`, eventname, MAX(`EventDateTime`) as MT 
    FROM `eventtable` 
    where eventname = "DND" 
    Group by RoomNum 
) b 
on a.RoomNum = b.RoomNum and a.EventDateTime = b.MT and a.eventname = b.eventname 
WHERE a.EventName = "DND" 

Наблюдайтеwhere в конце.

+0

Ваше решение, а также Dhaval работает. Я думал, что конечный результат первого SELECT получает JOINED со вторым. Вот почему я хотел ограничить свою первую таблицу, чтобы она была ОБЪЕДИНЕНИЕМ из двух меньших таблиц. Размещение WHERE предполагает, что это не так, и требуемое время поддерживает это. занимает 0,0156 с, мой внутренний выбор занимает 1,34 с, но для всего фильтра требуется 40 с, что слишком велико ... Есть ли способ уменьшить размеры таблиц до того, как выполняется INNER JOIN? – janson

+0

Я думаю, да. e alias к таблице после 'where' clause, а затем присоединиться к ним – Abhishek

+0

Я пробовал, прежде чем задал свой вопрос с назначением псевдонима, но просто получил« ошибку в синтаксисе SQL ». Я пробовал SELECT ... FROM ... ГДЕ ... AS myAlias ​​INNER JOIN. Поскольку вы учитесь у вас и других, что WHERE должен быть в абсолютном конце запроса, я попробовал SELECT ... FROM ... eventtable INNER JOIN ... ON ... WHERE a.EventName = "DND" AS myAlias , Также ошибки. Извините, мои знания SQL действительно ограничены. – janson

0

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

SELECT a.RoomNum, a.EventName, a.EventStatus, a.EventDateTime from eventtable a 
    INNER JOIN 
    (
     SELECT `RoomNum`, eventname, MAX(`EventDateTime`) as MT 
     FROM `eventtable` 
     where eventname = "DND" 
     Group by RoomNum 
    ) b 
    on a.RoomNum = b.RoomNum and a.EventDateTime = b.MT and a.eventname = b.eventname 
WHERE a.EventName = "DND" 

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

SELECT a.RoomNum, a.EventName, a.EventStatus, a.EventDateTime from eventtable a 
INNER JOIN 
(
    SELECT `RoomNum`, eventname, MAX(`EventDateTime`) as MT 
    FROM `eventtable` 
    where eventname = "DND" 
    Group by RoomNum 
) b 
on a.RoomNum = b.RoomNum and a.EventDateTime = b.MT and a.eventname = b.eventname and a.EventName = "DND" 
0

Во-первых, JOIN может быть на двух таблицах. И пока вы пишете, что вы не должны добавлять условия для этих двух. Если вы хотите, добавьте их в конце.

Поместите предложение where в конец и оно будет работать.