2012-02-05 2 views
1

У меня есть четыре таблицы (ткани, оговорки и члены ткани, узлы).MySQL Количество связанных полей в таблице из двух других таблиц

Каждый «узел» может иметь ноль более «составных членов» (связанных с ним). Каждая «ткань» может иметь ноль или более «составных членов» (связанных с ней). Узел может иметь «резервирование» на нем, связанное с ним одним «узлом».

Таким образом, вы можете видеть ссылки между этими вещами, когда:

fabricmember.ipaddr = reservation.ipaddr 

и

fabricmember.fabric = fabric.fabricname

(Вы можете сделать все это без фактического ссылаясь на «узел»).

Я хочу запустить один запрос, который может показать мне для каждой ТКАНИ, сколько (суммы) БРОНИРОВАНИЯ связаны с ней и сколько (sum) fabricmembers оно имеет. Опять же, в одном запросе

Я использовал следующий запрос:

select 
    fabricmembers.fabric, 
    count(reservations.ipaddr) as Memebers, 
    count(nodes.ipaddr) as Reservations 
from fabricmembers 
LEFT JOIN (reservations,nodes) 
ON ((reservations.ipaddr = fabricmembers.ipaddr) and (nodes.ipaddr = fabricmembers.ipaddr)) 
GROUP BY (fabricmembers.fabric); 

И это почти работ, однако, если ткань имеет ноль членов, или она имеет членов, но те, члены имеют резервирование ZERO, ткань просто не отображается в запросе.

следующих работ, чтобы показать мне, сколько членов ткань имеет, даже если это число равно нулю:

select fabricname,count(fabricmembers.ipaddr) 
from fabrics 
LEFT JOIN (fabricmembers) 
ON (fabrics.fabricname = fabricmembers.fabric) 
GROUP BY (fabrics.fabricname); 

однако, я не могу понять, как получить запрос также сказать мне номер члены.

Есть ли в этом смысл? Любая помощь будет оценена!

ответ

1

Ваш запрос не возвращает ткани с нулевыми оговорками/нулевых членов, потому что вы пытаетесь строить из таблиц, где только ткани с оговорки/члены существуют! Единственное место, где вы можете найти пустые ткани, - это таблица тканей, поэтому вы должны строить его сверху вниз:

SELECT fabrics.fabricname, count(reservations.ipaddr), count(fabricmember.ipaddr) 
FROM fabrics 
LEFT JOIN fabricmembers ON fabrics.fabricname = fabricmembers.fabric 
LEFT JOIN reservations ON fabricmembers.ipaddr = reservations.ipaddr 
GROUP by fabric.fabricname 
+0

Я полностью понимаю, что вы говорите. Я знал это, я просто не знал, как с этим бороться. Я нашел способ решить его, но ваш выглядит намного элегантнее. Я попробую это позже сегодня вечером. Благодаря! – Brad

0

Вы должны использовать коррелированные подзапросы для этого что-то вроде:

SELECT fabricmembers.fabric f, 
     (SELECT count(*) FROM reservations r where r.ipaddr = f.ipaddr) Members, 
     (SELECT count(*) FROM nodes n where n.ipaddr = f.ipaddr) Reservations 
FROM fabricmembers 
Смежные вопросы