2013-08-07 5 views
0

У меня есть несколько таблиц. Таблицы и запрос MySQL можно найти в этом demo.MySQL возвращает неверные данные с использованием соединения

Эти таблицы:

  1. пользователи

    id name 
    1 abc 
    2 xyz 
    3 pqr 
    
  2. друг

    user_id friend_id 
    1  2 
    1  3 
    2  3 
    
  3. коллекция

    id user_id friend_id amount 
    1 1  2   100 
    2 2  1  -100 
    3 2  3   200 
    4 3  2  -200 
    5 1  3   300 
    6 3  1  -300 
    
  4. законопроект

    id use_id(bill_creator) 
    1 1 
    2 2 
    3 2 
    
  5. bill_person

    id bill_id user_id 
    1 1  1 
    2 1  2 
    3 1  3 
    4 2  2 
    5 2  3 
    6 3  2 
    6 3  1 
    

Так Пока я сделал этот запрос:

SELECT mf.id 
    , mf.name 
    , c.amount AS amount,count(bp.user_id) AS no_common_bills 
    FROM (
     SELECT fr.user_id AS user_id 
       , fr.friend_id AS friend_id 
      FROM friend fr 
      JOIN users fru 
      ON fru.id = fr.user_id 
      WHERE fru.id IN (1) 
      UNION 
     SELECT fl.friend_id AS user_id 
       , fl.user_id AS friend_id 
      FROM friend fl 
      JOIN users flf 
      ON flf.id = fl.friend_id 
      WHERE flf.id IN (1) 
     ) f 
    JOIN users mf 
    ON mf.id = f.friend_id 
    LEFT 
    JOIN collection c 
    ON c.friend_id = mf.id 
    AND c.user_id = f.user_id 
    LEFT JOIN bill_person bp 
    ON bp.user_id=f.user_id AND c.friend_id = mf.id 
GROUP BY mf.id 
ORDER BY mf.id 

и мой выход этого запроса

id NAME AMOUNT NO_COMMON_BILLS 
2 XYZ 100 2 
3 PQR 300 2 

, но я хочу этот результат:

id NAME AMOUNT NO_COMMON_BILLS 
2 XYZ 100 2 
3 PQR 300 1 

Я получаю неправильный выход на NO_COMMON_BILLS. Кроме этого, все значения верны.

+3

Пожалуйста, добавьте схему и данные здесь вместо того, чтобы просто SQLFiddle ссылку. – hims056

+0

@ hims056: у меня слишком много таблиц, поэтому я сделал SQLFiddle, чтобы сделать его проще. –

+0

Но что, если сайт sqlfiddle не работает? – hims056

ответ

0

третий раз это очарование ...

http://sqlfiddle.com/#!2/338dd/12

SELECT u.name friend 
     , COUNT(bp2.user_id) no_common_bills 
    FROM users u 
    LEFT 
    JOIN 
     (SELECT user_id me, friend_id them FROM friend WHERE user_id = 1 
     UNION 
     SELECT friend_id,user_id FROM friend WHERE friend_id = 1 
    ) x 
    ON x.them = u.id 
    LEFT 
    JOIN bill_person bp1 
    ON bp1.user_id = x.them 
    LEFT 
    JOIN bill_person bp2 
    ON bp2.bill_id = bp1.bill_id 
    AND bp2.user_id = x.me 
    WHERE u.id <> 1 
    GROUP 
    BY friend; 

FRIEND  NO_COMMON_BILLS 
jkl  0 
mno  0 
pqr  1 
xyz  2 
+0

см. Я 'подсчитываю количество счетов, общих между пользователем и его друзьями'.so мне нужно' count of bill_id' между его каждым другом –

+0

эй ваш запрос работает, но когда 'если пользователь имеет запись в таблице друзей ', но у него есть 'no bills' с ним в то время мне нужно« ответить нуль или 0 »увидеть это http://sqlfiddle.com/#!2/338dd/1, я изменил данные, и вы можете видеть, что я не могу получить' mno (user_id = 4) и jkl (user_id = 5) ' –

+0

Я пробую' left join' и 'count (f.user_id)', но он не работает. –