За последние 24 часа нас посетили 21703 программиста и 1016 роботов. Сейчас ищут 693 программиста ...

Подзапрос с множественным результатом

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

  1. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    если не планируется записей много то у мускула есть FIND_IN_SET для работы с строкой с запятыми))
     
  2. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    А что мне это даст, если такая структура всё-равно не работает?
    Код (Text):
    1. SELECT `pokazateli`.`products`,
    2. (SELECT GROUP_CONCAT(`name_product`) FROM `products` WHERE `id` IN(`pokazateli`.`products`)) AS `all_products`
    3. FROM `pokazateli`
    Мне вроде помог тут один чувак:
    Код (Text):
    1. SELECT pokazateli.name_pokazatel, GROUP_CONCAT(DISTINCT products.name_product) AS all_products, GROUP_CONCAT(DISTINCT reglaments.name_reglament) AS all_reglaments
    2. FROM pokazateli
    3.   LEFT JOIN rel_products ON pokazateli.id = rel_products.pokazatel_id
    4.   LEFT JOIN products     ON products.id   = rel_products.product_id
    5.  
    6.   LEFT JOIN rel_reglaments ON pokazateli.id = rel_reglaments.pokazatel_id
    7.   LEFT JOIN reglaments     ON reglaments.id = rel_reglaments.reglament_id
    8.  
    9. GROUP BY pokazateli.id
    10. ORDER BY all_products
    Надо отвлечься, сегодня дотестирую всё ли работает. Если всё ок, то @ADSoft закину 500 рубасов, он был близок.
     
  3. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    даст костыль)) я просто сообщил что вариант значений через запятую в мускуле имеется из коробки)))
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    У тебя не будет работать как "желаешь"
     
  5. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    @MouseZver Почему? Вроде всё работает и даже значения сортируются по алфавиту. Там же LEFT JOIN везде. Если GROUP BY p.id убрать, то вторая запись не выводится - я вот не понимаю как это работает.

    [​IMG]
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    Добавь новый показатель, но без продукции
     
  7. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    @MouseZver Добавил, он вывелся.

    upload_2019-12-5_19-59-24.png
     
  8. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    В данном случае проще тебе код написать, чем объяснить. Но ещё раз повторюсь, сортировка будет только по полю показатели, если сотировать по группированному полю, то поменяются местами только бабушкины носки и свитер с катушками.
     
  9. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    @Valick Работает сортировка. Что не так-то?
    Код (Text):
    1. SELECT p.name_pokazatel,
    2. GROUP_CONCAT(DISTINCT pr.name_product) AS `all_products`,
    3. GROUP_CONCAT(DISTINCT pr2.name_reglament) AS `all_reglaments`
    4. FROM pokazateli AS p
    5.     LEFT JOIN rel_products AS rel ON p.id = rel.pokazatel_id
    6.         LEFT JOIN products AS pr ON pr.id = rel.product_id
    7.        
    8.     LEFT JOIN rel_reglaments AS rel2 ON p.id = rel2.pokazatel_id
    9.         LEFT JOIN reglaments AS pr2 ON pr2.id = rel2.reglament_id
    10.        
    11. GROUP BY p.id
    12. ORDER BY all_reglaments
    upload_2019-12-5_21-5-2.png
     
  10. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Чуть не упустил один момент - GROUP_CONCAT выводит строку длиной максимум 1000 символов. То есть, для вывода её использовать не нужно, только для сортировки в запросе. Мне в принципе это и нужно было, 1000 символов для сортировки достаточно. А выведу продукцию полностью я уже вторым запросом ниже.