1

Тема: Вибірка кількості записів в третій таблиці

Доброго дня
Звертаюсь по підказку до спільноти, є таблиці

-- Main costcalculator table
CREATE TABLE IF NOT EXISTS `cot_cc_calcs` (
    `cc_id` int(11) NOT NULL auto_increment,
    `cc_name` varchar(255) collate utf8_unicode_ci NOT NULL default '',
    `cc_desc` text(500) collate utf8_unicode_ci NOT NULL default '',
    `cc_groups` text(500) collate utf8_unicode_ci NOT NULL,
    `cc_order` int(4) default NULL,    
    PRIMARY KEY (`cc_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


-- Rows costcalculator table
CREATE TABLE IF NOT EXISTS `cot_cc_calcs_rows` (
    `ccr_id` int(11) NOT NULL auto_increment,
    `cc_id` int(11) NOT NULL,
    `ccr_name` varchar(255) collate utf8_unicode_ci NOT NULL default '',
    `ccr_desc` text(500) collate utf8_unicode_ci NOT NULL default '',
    `ccr_units` varchar(255) collate utf8_unicode_ci NOT NULL default '',
    `ccr_order` int(4) default NULL,    
    PRIMARY KEY (`ccr_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- User cost costcalculator table
CREATE TABLE IF NOT EXISTS `cot_cc_calcs_users_cost` (
    `ccu_id` int(11) NOT NULL auto_increment,
    `ccr_id` int(11) NOT NULL,
    `ccu_user_id` int(11) NOT NULL,
    `ccu_cost` int(11) NOT NULL,
    `ccu_updated` int(11) NOT NULL,    
    PRIMARY KEY (`ccu_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Потрібно виконати такий запит (він з помилкою)

SELECT c.*, COUNT(r.ccr_id) AS cc_row_count, COUNT(DISTINCT ur.ccu_user_id) AS ur_specialists
                        FROM $db_cc_calcs AS c 
                        LEFT JOIN $db_cc_calcs_rows AS r ON c.cc_id = r.cc_id 
                        LEFT JOIN $db_cc_calcs_users_cost AS ur ON r.ccr_id = ur.ccr_id 
                        GROUP BY c.cc_id 
                        HAVING cc_row_count > 0
                        ORDER BY c.cc_order ASC 
                        LIMIT 0, 50

Суть, вибрати з таблиці cot_cc_calcs записи в яких кількість рядків в таблиці cot_cc_calcs_rows по cc_id  більше 0 і в свою чергу потрібно підрахувати скільки записів в таблиці cot_cc_calcs_users_cost для значень з таблиці cot_cc_calcs_rows по полю ccr_id

Щось намудрував чи чогось не вистачає?

Дякую

2

Re: Вибірка кількості записів в третій таблиці

Оскільки тут використовується left join, до результату буде включено рядки, де потрібного r.cc_id чи ur.ccr_id не знайдено (замість них підставлятимуться null), і функція count їх також порахує (тобто, в останніх двох стовпчиках результату ми побачимо одиниці там, де мали б бути нулі). Щоб цього уникнути, слід зробити такий же запит, але з join замість left join. Якщо треба також врахувати записи, де r.cc_id знайдено, а ur.ccr_id — ні, можна дописати union select ... з умовою для їх пошуку.