Добрый день. Имеются 3 таблицы - Клиенты, Прайс-листы, Товары. Прайс-листы связаны с Клиентами по id Клиента. Тавары связаны с прайс-листами по полю id прайс-листа. Можно ли одним запросом выбрать все поля из таблицы Клиентов и посчитать количество прайс-листов и товаров у каждого клиента.
Подскажи пожалуйста Сейчас запрос такой: SELECT t1.*, COUNT(t2.id) as pricelists FROM customers t1 LEFT JOIN pricelists t2 ON t1.id = t2.customerID GROUP BY t1.id ORDER BY t1.name
Структура таблицы `products` -- CREATE TABLE `products` ( `id` mediumint(8) NOT NULL, `name` text NOT NULL, `images` text NOT NULL, `unit` tinyint(3) NOT NULL, `price` varchar(255) NOT NULL, `own_production` enum('0','1') NOT NULL DEFAULT '0', `pricelistID` mediumint(8) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `products` (`id`, `name`, `images`, `unit`, `price`, `own_production`, `pricelistID`) VALUES (1, 'Цемент', '', 1, '250', '0', 1), (2, 'Песок', '', 1, '450', '0', 1), (3, 'Кирпич', '', 1, '40 коп', '0', 2); Структура таблицы `pricelists` -- CREATE TABLE `pricelists` ( `id` smallint(6) NOT NULL, `name` text NOT NULL, `customerID` int(11) NOT NULL, `cat_status` tinyint(3) NOT NULL COMMENT 'Товары или услуги', `enabled` enum('0','1') NOT NULL DEFAULT '1' ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `pricelists` (`id`, `name`, `customerID`, `cat_status`, `enabled`) VALUES (1, 'Товары', 1, 1, '1'), (2, 'Товары', 2, 1, '1'), (3, 'Товары для народа', 2, 1, '1'); Структура таблицы `customers` -- CREATE TABLE `customers` ( `id` int(10) NOT NULL, `name` varchar(255) NOT NULL, `full_name` varchar(255) NOT NULL, `alias` text NOT NULL, `inn` varchar(20) NOT NULL, `operation` text NOT NULL, `image` varchar(10) NOT NULL, `adres` text NOT NULL, `uadres` text NOT NULL, `phones` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `site` varchar(255) NOT NULL, `socseti` text NOT NULL, `description` text NOT NULL, `fax` varchar(255) NOT NULL, `map` varchar(50) NOT NULL, `categories` varchar(255) NOT NULL, `enabled` enum('0','1') NOT NULL DEFAULT '1', `date_add` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `date_change` datetime NOT NULL, `views` smallint(5) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `customers` (`id`, `name`, `full_name`, `alias`, `inn`, `operation`, `image`, `adres`, `uadres`, `phones`, `email`, `site`, `socseti`, `description`, `fax`, `map`, `categories`, `enabled`, `date_add`, `date_change`, `views`) VALUES (1, 'ООО Империя', 'Общество с ограниченной ответственностью Империя', '1_Obschestvo_s_ogranichennoy_otvetstvennostyu_Imperiya', '23564', '', '1_1.png', '', '', '', '', '', '1,2', '', '', '', '1,2,3,4', '1', '2019-11-26 17:51:09', '0000-00-00 00:00:00', 0), (2, 'ООО Фортуна', 'Общество с ограниченной ответственностью Фотуна', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '1', '2019-11-26 17:52:29', '0000-00-00 00:00:00', 0), (3, 'Автошина', 'Индивидуальный предприниматель Иванова Ирина Александровна', '3_Individualnyy_predprinimatel_Ivanova_Irina_Aleksandrovna', '0', '', '', '', '', '', '', '', '', '', '', '', '47,48,5', '1', '2019-11-26 17:52:29', '0000-00-00 00:00:00', 0), (4, 'ООО Канцлер', '', '4_', '23564', '', '', '', '', '', '', '', '', '', '', '', '40,1,42,2', '1', '2019-12-06 12:29:44', '0000-00-00 00:00:00', 0);
https://www.db-fiddle.com/f/wdFVEVWr23y6sKYeXAvDDF/0 Код (SQL): SELECT customers.*, ( SELECT COUNT(*) FROM pricelists WHERE pricelists.customerID = customers.id ) AS price_count, ( SELECT COUNT(*) FROM products JOIN pricelists ON pricelists.id = products.pricelistID WHERE pricelists.customerID = customers.id ) AS product_count FROM customers пришлось только date_change сделать nullable, в новых версиях '0000-00-00 00:00:00' не прокатывает. но это рояля не играет.
Спасибо большое. У меня еще вот так получилось. SELECT t1.*, COUNT(DISTINCT t2.id) as pricelists, COUNT(DISTINCT t3.id) as products FROM customers t1 LEFT JOIN pricelists t2 ON t1.id = t2.customerID LEFT JOIN products t3 ON t3.pricelistID = t2.id GROUP BY t1.id ORDER BY t1.name
@anipriev чтобы запрос выглядел красиво, помещай его в ббкод [code=SQL] . . . [/code] --- Добавлено --- @anipriev вот такое, как ты сделал SELECT * . . . GROUP BY . . . неправильно с т.з. стандарта ANSI SQL и в новых версиях MySQL это запрещено по умолчанию (но можно настроить) так что лучше избегать. Смысл запрета в том, что значение полей может быть неочевидным, если это не группируемые поля и не агрегатное выражение. Просто MySQL прощает(щал) такое безобразие. Это (была) плохая его особенность. Попробуй сделать Run здесь: https://www.db-fiddle.com/f/jzQuFT2VGw87H5XvoVmJD6/1
@anipriev, посмотри примеры "калиграфии" SQL. Красиво написанный запрос - это не просто понты, это помогает понимать что к чему, и прежде всего тебе самому.