2011-01-19 2 views
0

У меня есть 3 таблицы, но я могу только присоединиться к другому счету таблицы. Смотри ниже. Один ниже работает как шарм, но мне нужно добавить еще один «счет» из другой таблицы.mysql query with double join

есть 3-я таблица под названием «ci_nomatch» и содержит ссылку на ci_address_book.reference , которая может иметь несколько записей (многие из многих), но мне нужен только счет этой таблицы.

так что если ci_address_book будет иметь записи под названием "item1", "пункт 2", "ITEM3" и ci_nomatch бы "1, ITEM1, user1", "2, item1, USER4"

Я бы как вернуть «2» для Item1 в запросе.

Любые идеи? Я попробовал другое соединение, но он говорит мне, что ссылки не существует, пока он это делает!

SELECT c.*, IFNULL(p.total, 0) AS matchcount 
FROM ci_address_book c 
LEFT JOIN (
    SELECT addressbook_id, COUNT(match_id) AS total 
    FROM ci_matched_sanctions 
    GROUP BY addressbook_id 
) AS p 
ON c.id=p.addressbook_id 
ORDER BY matchcount DESC 
LIMIT 0,15 
+0

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

ответ

1

Вы можете подзапрос его непосредственно в выбранном

SELECT c.*, IFNULL(p.total, 0) AS matchcount, 
    (SELECT COUNT(*) FROM ci_nomatch n on n.reference = c.reference) AS othercount 
FROM ci_address_book c 
LEFT JOIN (
    SELECT addressbook_id, COUNT(match_id) AS total 
    FROM ci_matched_sanctions 
    GROUP BY addressbook_id 
) AS p 
ON c.id=p.addressbook_id 
ORDER BY matchcount DESC 
LIMIT 0,15 

@updated для комментариев. Включение дополнительного столбца «(matchcount - othercount) AS, вычитаемый», было бы лучше всего сделать путем подпроцесса.

SELECT *, matchcount - othercount AS deducted 
FROM 
(
    SELECT c.* , IFNULL(p.total, 0) AS matchcount, (
     SELECT COUNT(*) FROM ci_falsepositives n 
     WHERE n.addressbook_id = c.reference) AS othercount 
    FROM ci_address_book c 
    LEFT JOIN (
     SELECT addressbook_id, COUNT(match_id) AS total 
     FROM ci_matched_sanctions GROUP BY addressbook_id) AS p 
     ON c.id = p.addressbook_id ORDER BY matchcount DESC LIMIT 0 , 15 
) S 
+0

это дает мне ошибку на "on n.reference = c.reference" – renevdkooi

+0

[есть 3-я таблица под названием ci_nomatch и содержит ссылку на ci_address_book.reference] - какое поле в ci_nomatch присоединяется к book.reference? – RichardTheKiwi

+0

Я нашел, что это сработало: SELECT c. *, IFNULL (p.total, 0) КАК MatchCount, \t (SELECT COUNT (*) \t ОТ ci_falsepositives п \t ГДЕ n.addressbook_id = c.reference \t) КАК othercount ОТ ci_address_book с LEFT JOIN \t (SELECT addressbook_id, COUNT (match_id) как общий \t ОТ ci_matched_sanctions \t ГРУППА ПО addressbook_id \t) А.С. р = О c.id p.addressbook_id ORDER BY DESC MatchCount LIMIT 0, 15 – renevdkooi