2014-01-19 5 views
0

У меня есть этот запрос ниже. В таблице «stats» с именем пользователя есть несколько строк. 1 для каждого сервера (ов). Он продолжает дублировать убийства & значение смертности в зависимости от количества строк в таблице статистики с именем пользователя. Например, если в таблице pvp есть 2 убийства и 1 смерть для имени пользователя Test, а в таблице статистики есть 2 строки с именем пользователя Test one для server1 и one для server2, то при запуске этого запроса он показывает 4 убийства и 2 смертей. Я не знаю, почему.Проблема с расширенным запросом MySQL LEFT JOIN

Вот SQLFiddle: http://sqlfiddle.com/#!2/c7049/1

SELECT st.*, 
COALESCE(SUM(pvp.killer = st.username), 0) AS kills, 
COALESCE(SUM(pvp.username = st.username), 0) as deaths, 
COALESCE(ROUND(SUM(pvp.killer = st.username)/SUM(pvp.username = st.username), 2), 0.00) 
as kd FROM stats AS st 
LEFT JOIN pvp ON pvp.username = st.username OR pvp.killer = st.username 
WHERE st.username="Username" 
+0

Пожалуйста, разместите данные образца и требуемый результат. Или, что еще лучше, создайте [SQL Fiddle] (http://sqlfiddle.com/) для вашей проблемы. –

+1

Вот SQLFiddle: http://sqlfiddle.com/#!2/c7049/1 – user3205106

+0

Еще один шаг. Какой результат (результат) должен получить такой запрос? Что вы считаете правильным? Пожалуйста, напишите в виде таблицы. –

ответ

0

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

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

SELECT stats.*, 
COALESCE(SUM(pvp.killer = stats.username), 0) AS kills, 
COALESCE(SUM(pvp.username = stats.username), 0) as deaths, 
COALESCE(ROUND(SUM(pvp.killer = stats.username)/SUM(pvp.username = stats.username), 2), 0.00) 
as kd 
FROM pvp 
LEFT JOIN stats ON pvp.username = stats.username OR pvp.killer = stats.username 
WHERE stats.username="Username" 

Это на самом деле не плохое Руководство http://www.w3schools.com/sql/sql_join_left.asp

+0

Это говорит «Неизвестная таблица» st'' – user3205106

+0

@ user3205106, потому что я удалил AS из статистики, теперь редактируя ее. – Aaron

+0

Его по-прежнему делает ту же проблему, что и первый запрос. Парный. – user3205106

1

Я думаю, что вы путаете серверы деталей, так что вы, вероятно, нужно AND(st.server = pvp.server) в запросе (в РЕГИСТРИРУЙТЕСЬ состоянии)

SELECT st.id,st.username,st.balance,st.xplevel,st.server, 
COALESCE(SUM(pvp.killer = st.username), 0) AS kills, 
COALESCE(SUM(pvp.username = st.username), 0) as deaths, 
COALESCE(ROUND(SUM(pvp.killer = st.username)/SUM(pvp.username = st.username), 2), 0.00) 
as kd 
FROM stats AS st 
LEFT JOIN pvp ON (pvp.username = st.username OR pvp.killer = st.username) 
       AND(st.server = pvp.server) 
WHERE st.username="tacoboboy32" 
GROUP BY st.id,st.username,st.balance,st.xplevel,st.server 

Также, если вы не используете GROUP BY, вы получите только одну строку, поэтому просто группируйте каждое поле в st. и он предоставит вам различную информацию для каждого сервера.

sqlFiddle