2016-01-03 3 views
0

У меня есть следующий запрос, который я использую, чтобы получить список имен пользователей из таблицы users, которые не отправили запрос или получили запрос от пользователя с идентификатором id ' XXXXXXXXXX»в таблице friends:Выбор count возвращает null вместо 0 внутри внутреннего соединения

SELECT u.user, f1.c1, f2.c2 
FROM users u 
LEFT JOIN 
(
    SELECT uid, fid, COUNT(*) AS c1 
    FROM friends f 
    WHERE f.fid = 'xXXXxXXxxx' 
) AS f1 
ON f1.uid = u.uid 
LEFT JOIN 
(
    SELECT uid, fid, count(*) AS c2 
    FROM friends f 
    WHERE f.uid = 'xXXXxXXxxx' 
) AS f2 
ON f2.fid = u.uid; 

выход:

+------------+------+------+ 
| user  | c1 | c2 | 
+------------+------+------+ 
| User1  | NULL | NULL | 
| User2  | NULL | 1 | 
| User3  | NULL | NULL | 
| User4  | 1 | NULL | 
| User5  | NULL | NULL | 
+------------+------+------+ 

Почему я получаю NULL значение для подсчетов вместо 0? и есть ли лучший способ запустить этот запрос?

+0

Пробовали ли вы использовать 'GROUP BY' ? –

+0

@user да это ничего не изменило – razzak

ответ

1

если ваш правильный результат, кроме 0, то вы можете использовать функцию IFNULL() для получения 0 как IFNULL(f1.c1,0);

SELECT u.user,IFNULL(f1.c1,0), IFNULL(f2.c2,0) 
FROM users u 
LEFT JOIN 
(
    SELECT uid, fid, COUNT(*) AS c1 
    FROM friends f 
    WHERE f.fid = 'xXXXxXXxxx' 
) AS f1 
ON f1.uid = u.uid 
LEFT JOIN 
(
    SELECT uid, fid, count(*) AS c2 
    FROM friends f 
    WHERE f.uid = 'xXXXxXXxxx' 
) AS f2 
ON f2.fid = u.uid; 

также использовать GROUP BY, чтобы получить одну строку кол пользователя пользователем

LEFT JOIN: ЛЕВАЯ РЕГИСТРИРУЙТЕСЬ ключевое слово возвращает все строки из левой таблицы (table1), с соответствующими строками правый стол (таблица2). Результат имеет NULL с правой стороны, когда нет совпадения.

enter image description here

http://dev.mysql.com/doc/refman/5.7/en/left-join-optimization.htmlhttp://www.w3schools.com/sql/sql_join_left.asp

теперь, если вы хотите хотите получить 0, то вы должны использовать IFNULL() Funciton

+0

Мой вопрос в том, почему это null, если вы запустили 'select count (*) от пользователей, где 1 = 0', например, он возвращает 0 – razzak

+1

В вашем запросе используется левое соединение, и если вы используете левое соединение, вы получаете всю строку из левой таблицы, а не ее столбец из столбца правой таблицы или нет. если нет ни одного столбца правой таблицы, его возвращает 'NULL'. не '0'. –

+0

@Vipin_jain вы могли бы удалить предложение «GROUP BY» в своем ответе, потому что оно не имеет никакого влияния – razzak

0
SELECT u.uid, 
     (SELECT COUNT(*) FROM friends f WHERE f.uid=u.uid AND f.fid = 'xXXXxXXxxx') c1, 
     (SELECT COUNT(*) FROM friends f WHERE f.uid=u.uid AND f.uid = 'xXXXxXXxxx') c2 
     FROM users u 

WHERE (SELECT COUNT(*) FROM friends f WHERE f.uid=u.uid AND f.fid = 'xXXXxXXxxx') = 0 
OR (SELECT COUNT(*) FROM friends f WHERE f.uid=u.uid AND f.uid = 'xXXXxXXxxx') = 0 
1

или просто

SELECT user, 
     (SELECT COUNT(*) FROM friends f WHERE f.uid=u.uid AND f.fid = 'xXXXxXXxxx') f1, 
     (SELECT COUNT(*) FROM friends f WHERE f.fid=u.uid AND f.uid = 'xXXXxXXxxx') f2 
FROM users u 

Редактировать, чтобы выполнить свой комментарий ниже вы можете сделать

SELECT * FROM 
     (SELECT user, 
     (SELECT COUNT(*) FROM friends f WHERE f.uid=u.uid AND f.fid = 'xXXXxXXxxx') f1, 
     (SELECT COUNT(*) FROM friends f WHERE f.fid=u.uid AND f.uid = 'xXXXxXXxxx') f2 
     FROM users u 
     ) uu 
WHERE f1 = 0 AND f2 = 0 

С другой стороны, более простым запросом, в котором перечислены только имена пользователей, которые соответствуют вашему состоянию будет

SELECT user FROM users u 
WHERE NOT EXISTS (SELECT 1 FROM friends f WHERE u.uid IN (f.uid,f.fid) 
            AND 'xXXXxXXxxx' IN (f.uid,f.fid)) 
+0

OK, только что скорректировано. – cars10m

+0

если я хочу добавить, где близко в конце запроса, как я могу ссылаться на f1 и f2? скажем, например, 'где f1 = 0 и f2 = 0' – razzak

+0

Спасибо, +1 за добавление ссылок f1 и f2, но этот запрос не намного лучше, чем тот, который я использую. – razzak

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