Запрос MySQL LEFT JOIN показывает то же значение

Я пытаюсь сделать так, чтобы этот запрос ниже подсчитывал строки из другой таблицы, у которых есть имя пользователя, а затем смерти, у которых есть убийца. В таблице статистики есть 1 строка для каждого имени пользователя, но несколько строк в таблице pvp с именем пользователя. По какой-то причине в столбце смертей столько же, сколько в столбце убийств, кто-нибудь знает, почему? Вот мой запрос. Вот скрипка sql. Думаю, я правильно понял, как использовать sqlfiddle: http://sqlfiddle.com/#!2/b793b/1

SELECT 
    *,
    COUNT(pvptable.killer) as kills,   
    COUNT(pvptable.username) as deaths,
    ROUND(COUNT(pvptable.killer) / COUNT(pvptable.username), 2) as kd
FROM
    stats as st
    LEFT JOIN pvp as pvptable ON pvptable.killer=st.username
WHERE
    st.username="Username";

person user3205106    schedule 18.01.2014    source источник
comment
Не могли бы вы добавить некоторые примеры данных и ожидаемые результаты на свой вопрос, а также создать файл sqlfiddle. Я не могу понять, что вы пытаетесь подсчитать, так как вы не показали четко свою схему.   -  person Barmar    schedule 18.01.2014
comment
Пожалуйста, опубликуйте свои структуры таблиц. Похоже, вам, вероятно, нужно два соединения с одной и той же таблицей, одно для убийств и одно для смертей.   -  person Michael Berkowski    schedule 18.01.2014
comment
Да я делаю, но я не знаю, как это сделать.   -  person user3205106    schedule 18.01.2014
comment
зачем вам использовать псевдоним, который длиннее реального имени таблицы?!?   -  person Barmar    schedule 18.01.2014
comment
Каков ожидаемый результат запроса?   -  person Barmar    schedule 18.01.2014


Ответы (2)


SELECT st.*,
       SUM(pvp.killer = st.username) AS kills,
       SUM(pvp.username = st.username) as deaths
FROM stats AS st
LEFT JOIN pvp ON pvp.username = st.username OR pvp.killer = st.username
WHERE st.username = "Username"

ДЕМО

Чтобы сделать это для всех, используйте GROUP BY:

SELECT st.*,
       SUM(pvp.killer = st.username) AS kills,
       SUM(pvp.username = st.username) as deaths
FROM stats AS st
LEFT JOIN pvp ON pvp.username = st.username OR pvp.killer = st.username
GROUP BY st.username

ДЕМО

person Barmar    schedule 18.01.2014
comment
Спасибо, вы случайно не знаете, как сделать то же самое, но он будет показывать всех пользователей и статистику пвп/смертей вместо поиска 1? - person user3205106; 18.01.2014
comment
Добавил это в ответ - person Barmar; 18.01.2014

COUNT(foo) и COUNT(bar) оба подсчитывают количество строк в результирующем наборе, вы могли бы также сказать COUNT(*) в обоих случаях.

Например, вам нужно COUNT(*) FROM ... GROUP BY killer, чтобы получить количество убийц. Не уверен, какова структура таблицы, чтобы дать вам полный ответ.

person spraff    schedule 18.01.2014
comment
Вероятно, лучше подождать, пока он не опубликует более подробную информацию, прежде чем пытаться опубликовать ответ. - person Barmar; 18.01.2014
comment
COUNT(foo) и COUNT(*) будут разными, если foo имеет NULL значений. - person PM 77-1; 18.01.2014