За последние 24 часа нас посетили 22537 программистов и 1015 роботов. Сейчас ищут 652 программиста ...

Выборка из 3-х таблиц

Тема в разделе "MySQL", создана пользователем anipriev, 17 дек 2019.

  1. anipriev

    anipriev Активный пользователь

    С нами с:
    9 окт 2014
    Сообщения:
    8
    Симпатии:
    0
    Добрый день.

    Имеются 3 таблицы - Клиенты, Прайс-листы, Товары.
    Прайс-листы связаны с Клиентами по id Клиента. Тавары связаны с прайс-листами по полю id прайс-листа.

    Можно ли одним запросом выбрать все поля из таблицы Клиентов и посчитать количество прайс-листов и товаров у каждого клиента.
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
  3. anipriev

    anipriev Активный пользователь

    С нами с:
    9 окт 2014
    Сообщения:
    8
    Симпатии:
    0
    Подскажи пожалуйста

    Сейчас запрос такой: 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
     
  4. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    дампы таблиц с частью данных надо. нет ни времени ни желания "сочинять"
     
  5. anipriev

    anipriev Активный пользователь

    С нами с:
    9 окт 2014
    Сообщения:
    8
    Симпатии:
    0
    Структура таблицы `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);
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    https://www.db-fiddle.com/f/wdFVEVWr23y6sKYeXAvDDF/0

    Код (SQL):
    1. SELECT
    2.   customers.*,
    3.   (
    4.   SELECT COUNT(*)
    5.   FROM pricelists
    6.   WHERE pricelists.customerID = customers.id
    7.   ) AS price_count,
    8.   (
    9.   SELECT COUNT(*)
    10.   FROM products
    11.   JOIN pricelists ON pricelists.id = products.pricelistID
    12.   WHERE pricelists.customerID = customers.id
    13.   ) AS product_count
    14. FROM customers
    пришлось только date_change сделать nullable, в новых версиях '0000-00-00 00:00:00' не прокатывает. но это рояля не играет.
     
  7. anipriev

    anipriev Активный пользователь

    С нами с:
    9 окт 2014
    Сообщения:
    8
    Симпатии:
    0
    Спасибо большое.

    У меня еще вот так получилось.

    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
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    @anipriev чтобы запрос выглядел красиво, помещай его в ббкод
    [code=SQL]
    . . .
    [/code]
    --- Добавлено ---
    @anipriev вот такое, как ты сделал
    SELECT * . . .
    GROUP BY . . .
    неправильно с т.з. стандарта ANSI SQL и в новых версиях MySQL это запрещено по умолчанию (но можно настроить)
    так что лучше избегать.

    Смысл запрета в том, что значение полей может быть неочевидным, если это не группируемые поля и не агрегатное выражение. Просто MySQL прощает(щал) такое безобразие. Это (была) плохая его особенность.

    Попробуй сделать Run здесь: https://www.db-fiddle.com/f/jzQuFT2VGw87H5XvoVmJD6/1
     
  9. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @anipriev, посмотри примеры "калиграфии" SQL. Красиво написанный запрос - это не просто понты, это помогает понимать что к чему, и прежде всего тебе самому.
     
  10. anipriev

    anipriev Активный пользователь

    С нами с:
    9 окт 2014
    Сообщения:
    8
    Симпатии:
    0
    Спасибо Вам большое. Очень помогли.