2015-04-10 2 views
1

Я пытаюсь создать трехстороннее соединение между отметками, сообщениями и голосами. Я попытался смоделировать the other posts по этому конкретному запросу, но это не похоже на работу:Ошибка связи Mysql 3 way

Ошибка

[Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN votes ON votes.messageId = messages.id ORDER BY timestamp DESC' at line 1] 

Вот мой запрос:

var query = ([ 
    'SELECT * FROM marks', 
    'LEFT JOIN messages', 
    'ON marks.messageId = messages.id', 
    'WHERE marks.x between ? AND ?', 
    'AND marks.y between ? AND ?', 
    'LEFT JOIN votes', 
    'ON votes.messageId = messages.id', 
    'ORDER BY timestamp DESC' 
]).join(' '); 

Схема

CREATE TABLE marks (
    id int(5) AUTO_INCREMENT, 
    PRIMARY KEY (id), 
    x float(10, 6), 
    y float(10, 6), 
    z float(10, 6), 
    timestamp timestamp DEFAULT CURRENT_TIMESTAMP, 
    messageId int(5), 
    FOREIGN KEY (messageId) REFERENCES messages(id), 
    userToken VARCHAR(255), 
    FOREIGN KEY (userToken) REFERENCES users(token) 
); 

CREATE TABLE messages (
    id int(5) AUTO_INCREMENT, 
    PRIMARY KEY (id), 
    messageString text, 
    score int(5) DEFAULT 0 
); 

CREATE TABLE votes (
    id int(5) AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    userToken VARCHAR(255), 
    FOREIGN KEY (userToken) REFERENCES users(token), 
    messageId int(5), 
    FOREIGN KEY (messageId) REFERENCES messages(id) 
); 
+2

ГДЕ должен быть после того, как все стыки. –

ответ

2

Попробуйте это:

var query = ([ 
    'SELECT * FROM marks', 
    'LEFT JOIN messages', 
    'ON marks.messageId = messages.id', 
    'LEFT JOIN votes', 
    'ON votes.messageId = messages.id', 
    'WHERE marks.x between ? AND ?', 
    'AND marks.y between ? AND ?', 
    'ORDER BY timestamp DESC' 
]).join(' '); 

Предложение WHERE должен быть после JOINS.

+0

Как я могу суммировать количество голосов за каждое сообщение? –

+2

@ chopperdrawlion4: - Вы можете использовать 'Group By Votes' и' sum (votes) '. Если бы я это правильно понял. :) –

+0

Значит, должна быть первая строка: 'SELECT *, SUM (голосов) ОТ марок',? –

1

Вы должны поместить join заявления до вашего where фильтра, например, так:

var query = ([ 
    'SELECT * FROM marks', 
    'LEFT JOIN messages', 
    'ON marks.messageId = messages.id', 
    'LEFT JOIN votes', 
    'ON votes.messageId = messages.id', 
    'WHERE marks.x between ? AND ?', 
    'AND marks.y between ? AND ?', 
    'ORDER BY timestamp DESC' 
]).join(' '); 
0

Ваши РЕГИСТРИРУЙТЕСЬ положения должны быть сгруппированы вместе, и ваш ИНЕКЕ должно быть после того, как из них.

Это должно работать для вас:

var query = ([ 
    'SELECT * FROM marks', 
    'LEFT JOIN messages', 
    'ON marks.messageId = messages.id', 
    'LEFT JOIN votes', 
    'ON votes.messageId = messages.id', 
    'WHERE marks.x between ? AND ?', 
    'AND marks.y between ? AND ?', 
    'ORDER BY timestamp DESC' 
]).join(' '); 
Смежные вопросы