2013-11-24 4 views
1

У меня есть следующий запрос:MySQL союз, присоединяется и ограничения

SELECT result.globalId AS id, result.date, p1.playerName AS player, p2.playerName AS target, w.weaponIngameName AS weapon, result.headshot, s.serverName AS server, result.origin 
FROM (
(

SELECT globalId, date, serverId, playerId, targetId, weaponId, headshot, 'playerkills' AS origin 
FROM playerkills 
WHERE (
playerkills.playerId =976 
OR playerkills.targetId =976 
) 
ORDER BY date DESC 
) 
UNION (

SELECT globalId, date, serverId, playerId, NULL , NULL , NULL , 'playersuicides' AS origin 
FROM playersuicides 
WHERE (
playersuicides.playerId =976 
) 
ORDER BY date DESC 
) 
)result 
LEFT JOIN players p1 ON result.playerId = p1.playerId 
LEFT JOIN players p2 ON result.targetId = p2.playerId 
LEFT JOIN weapons w ON result.weaponId = w.weaponId 
LEFT JOIN servers s ON result.serverId = s.serverId 
ORDER BY result.date DESC , result.globalId DESC 

И я хочу, чтобы ограничить result союз, чтобы иметь максимум 300 результатов, прежде чем любой из JOIN с применяются. Как это сделать?

Простое добавление LIMIT 300 после (...) result не работает, он дает следующую MySQL ошибка: 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 players p1 ON result.playerId = p1.playerId LEFT JOIN players p2 ON r' at line 9

+0

Можете ли вы обновить вопрос с ошибкой MySQL, которую вы получаете? –

+0

@ChrisMcCauley Обновлено по запросу. – skiwi

+0

, возможно, попробуйте 'AS result' вместо просто' result' непосредственно перед 'LEFT JOIN' – NickJ

ответ

0

При изменении запроса к следующему, он делает работу:

SELECT result.globalId AS id, result.date, p1.playerName AS player, p2.playerName AS target, w.weaponIngameName AS weapon, result.headshot, s.serverName AS server, result.origin 
FROM (
(

SELECT globalId, date, serverId, playerId, targetId, weaponId, headshot, 'playerkills' AS origin 
FROM playerkills 
WHERE (
playerkills.playerId =976 
OR playerkills.targetId =976 
) 
ORDER BY date DESC 
) 
UNION (

SELECT globalId, date, serverId, playerId, NULL , NULL , NULL , 'playersuicides' AS origin 
FROM playersuicides 
WHERE (
playersuicides.playerId =976 
) 
ORDER BY date DESC 
) ORDER BY date DESC LIMIT 300) result 
LEFT JOIN players p1 ON result.playerId = p1.playerId 
LEFT JOIN players p2 ON result.targetId = p2.playerId 
LEFT JOIN weapons w ON result.weaponId = w.weaponId 
LEFT JOIN servers s ON result.serverId = s.serverId 
ORDER BY result.date DESC , result.globalId DESC 

Обратите внимание, что я добавил ORDER BY date DESC LIMIT 300 перед вызовом таблицы result, так что происходит примерно следующее:

1) Individual SELECT s внутри UNION бегают.

2) UNION Используется для объединения результатов.

3) ORDER BY и LIMIT применяется к UNION.

4) UNION назван как result.

5) Остальная часть запроса происходит.

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