За последние 24 часа нас посетили 22515 программистов и 1209 роботов. Сейчас ищут 760 программистов ...

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

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

  1. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Есть база, условно с двумя таблицами - продукция и показатели. Нужно вывести список показателей так, чтобы в каждом был ещё список продукции. Сейчас я это вывожу двумя отдельными запросами в PHP, из-за этого становится невозможным сортировка через ORDER BY.

    [​IMG]

    Можно это как-то вывести одним запросом в базу? Пробовал так, выдаёт ошибку "Subquery returns more than 1 row":
    PHP:
    1. SELECT p.`id` AS `p_id`,
    2. (SELECT `id` FROM `products` WHERE `pokazatel`=`p_id`) AS `product_ids`
    3. FROM `pokazateli` AS `p`
    --- Добавлено ---
    Даже не спрашивайте зачем заказчику нужно сортировать по столбцу "продукция", когда там несколько значений. Сам этого не понимаю. Единственное что пока придумал для сортировки по этому столбцу это вытаскивать вообще все значения из базы и через PHP делать array_multisort. :confused:
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    Left join
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    +
    SELECT `symbol`, GROUP_CONCAT( `name` ) `names` FROM `%s` WHERE ? GROUP BY `symbol`
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
  5. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Не моя инициатива)) Проект ведёт заржавевший чувак.
     
  6. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Нифига не получается. Я переделал структуру немного, теперь у меня в таблице показателей есть столбец `products`, где я храню id продукции через запятую: 806,807. Решил сделать так, чтобы эту строку можно было прямо в запросе пихать в IN().
    Пробовал с JOIN:
    PHP:
    1. SELECT *, p.`id` AS `id`
    2. FROM `pokazateli` AS `p`
    3. LEFT JOIN `products` ON (`products`.`id` IN (p.`products`))
    Выдаёт:
    Код (Text):
    1. Unknown column 'p.products' in 'on clause'
    Пробовал как в первом посте:
    PHP:
    1. SELECT *, p.`id` AS `id`,
    2. (SELECT `name_product` FROM `products` WHERE `id` IN(p.`products`)) AS `all_products`
    3. FROM `pokazateli` AS `p`
    В итоге подзапрос возвращает в "all_products" название только одной продукции. Даже ошибки больше нет "Subquery returns more than 1 row". Как мне тут склеить название всех продукций в одну строку? Желательно через разделитель.
     
    #6 Nerfed, 5 дек 2019
    Последнее редактирование: 5 дек 2019
  7. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    А IN в LEFT JOIN ты сам придумал?
    Вообще то он работает так:
    PHP:
    1. LEFT JOIN `products` ON `products`.`id` = p.`products`
     
  8. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    @Artur_hopf ага, сам)) LEFT JOIN заработал, если не обзывать таблицу показателей AS `p`. Но выдаёт всё-равно не то что нужно - выдаёт значение только одной продукции. А мне нужно в подзапросе получить названия всех продуктов по списку айдишников и склеить их названия.

    Странно что вот это тоже выдаёт одно название. Тут в IN попадает 2 айдишника через запятую.
    PHP:
    1. SELECT `pokazateli`.`products`,
    2. (SELECT `name_product` FROM `products` WHERE `id` IN(`pokazateli`.`products`)) AS `all_products`
    3. FROM `pokazateli`
    Вот если я в IN руками вписываю значения, например IN(1,2), то выдаёт ошибку "Subquery returns more than 1 row", с которой по идеи уже что-то можно сделать с CONCAT.
     
    #8 Nerfed, 5 дек 2019
    Последнее редактирование: 5 дек 2019
  9. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Он выдает то что вы у него спрашиваете, а не то что вам хочется.
     
  10. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Окей, я кажется понял как засунуть в подзапрос айдишники руками - не суть.
    В этом подзапросе можно как-то склеить результаты в одну строку?
    PHP:
    1. (SELECT `name_product` FROM `products` WHERE `id` IN(1,2)) AS `all_products`
    Мне надо в `all_products` получить строку 'Бабушкины носкиСвитера с катушками'. Мне это нужно для возможности сортировки запроса по `all_products`.
     
  11. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    ну допустим получить ты их получил, а склеивать кто будет Пушкин?
    дословно "подзапрос вернул больше одной строки", тебе из этого надо сделать одну строку
    читай про GROUP_CONCAT
     
  12. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Ууу каеф, заработало. Всем спасибо)
    PHP:
    1. SELECT `pokazateli`.`products`,
    2. (SELECT GROUP_CONCAT(`name_product`) FROM `products` WHERE `id` IN(1,2)) AS `all_products`
    3. FROM `pokazateli`
    --- Добавлено ---
    Я только не понял почему в IN не скармливается значение из другой таблицы. Там же строка, где лежат айдишники через запятую и по идеи должно так работать:
    Код (Text):
    1. SELECT `pokazateli`.`products`,
    2. (SELECT GROUP_CONCAT(`name_product`) FROM `products` WHERE `id` IN(`pokazateli`.`products`)) AS `all_products`
    3. FROM `pokazateli`
    Но в итоге в итоге `all_products` попадает только одно значение и вообще оно не от этого показателя.
     
  13. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    потому, что айдишнеков через запятую там не должно быть, ибо это нарушение первого закона нормализации, кое грозит невозможностью работать с данными на уровне СУРБД, что собственно и подтверждается этим примером.
     
  14. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    @Valick а это решаемо? Можно в этот подзапрос как-то скормить значение столбца `products` из таблицы `pokazateli`?
    --- Добавлено ---
    Я импортирую базу из нереляционной IBM Lotus в реляционную MySQL, там со структурой вообще ужас, по другому тут не сделать.
     
  15. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    отдельную таблицу связей нужно
     
  16. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    для начала необходимо грамотно создать архитектуру БД, потом становится всё решаемо
    --- Добавлено ---
    не надо ля-ля :D
     
  17. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    У меня изначально так и было, но я почему-то решил, что через запятую проще. Окей, если я перегоню это в отдельную таблицу связей, то что это даст? Допустим, будет:

    pokazateli
    - id
    - name

    products
    - id
    - name

    relations
    - id
    - pokazatel_id
    - product_id

    Я уже готов закинуть 500р тому кто решит эту задачу.) За обучение, так сказать. Тут нужно одним запросом вывести всё из таблицы pokazateli, а названия продукции вывести в одну строчку, если они есть. Меня пугает вот это "если они есть".
    --- Добавлено ---
    Вот вам дамп базы. Может кто-то сделает, с меня 500р тогда. =\

    Код (Text):
    1.  
    2. -- phpMyAdmin SQL Dump
    3. -- version 4.8.5
    4. -- https://www.phpmyadmin.net/
    5. --
    6. -- Хост: localhost
    7. -- Время создания: Дек 05 2019 г., 15:28
    8. -- Версия сервера: 5.7.25
    9. -- Версия PHP: 7.0.8
    10.  
    11. SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    12. SET AUTOCOMMIT = 0;
    13. START TRANSACTION;
    14. SET time_zone = "+00:00";
    15.  
    16. --
    17. -- База данных: `testy-test`
    18. --
    19. CREATE DATABASE IF NOT EXISTS `testy-test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
    20. USE `testy-test`;
    21.  
    22. -- --------------------------------------------------------
    23.  
    24. --
    25. -- Структура таблицы `pokazateli`
    26. --
    27.  
    28. CREATE TABLE `pokazateli` (
    29.   `id` int(8) NOT NULL,
    30.   `name_pokazatel` text NOT NULL COMMENT 'id названия показателя'
    31. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Показатели';
    32.  
    33. --
    34. -- Дамп данных таблицы `pokazateli`
    35. --
    36.  
    37. INSERT INTO `pokazateli` (`id`, `name_pokazatel`) VALUES
    38. (1, 'Ворсистость'),
    39. (2, 'Пустой');
    40.  
    41. -- --------------------------------------------------------
    42.  
    43. --
    44. -- Структура таблицы `products`
    45. --
    46.  
    47. CREATE TABLE `products` (
    48.   `id` int(8) NOT NULL,
    49.   `name_product` text NOT NULL COMMENT 'Наименование продукции'
    50. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Продукция';
    51.  
    52. --
    53. -- Дамп данных таблицы `products`
    54. --
    55.  
    56. INSERT INTO `products` (`id`, `name_product`) VALUES
    57. (1, 'Бабушкины носки'),
    58. (2, 'Свитера с катушками'),
    59. (3, 'Не должно выводиться');
    60.  
    61. -- --------------------------------------------------------
    62.  
    63. --
    64. -- Структура таблицы `relations`
    65. --
    66.  
    67. CREATE TABLE `relations` (
    68.   `id` int(11) NOT NULL,
    69.   `pokazatel_id` int(8) NOT NULL,
    70.   `product_id` int(8) NOT NULL
    71. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    72.  
    73. --
    74. -- Дамп данных таблицы `relations`
    75. --
    76.  
    77. INSERT INTO `relations` (`id`, `pokazatel_id`, `product_id`) VALUES
    78. (1, 1, 1),
    79. (2, 1, 2);
    80.  
    81. --
    82. -- Индексы сохранённых таблиц
    83. --
    84.  
    85. --
    86. -- Индексы таблицы `pokazateli`
    87. --
    88. ALTER TABLE `pokazateli`
    89.   ADD PRIMARY KEY (`id`);
    90.  
    91. --
    92. -- Индексы таблицы `products`
    93. --
    94. ALTER TABLE `products`
    95.   ADD PRIMARY KEY (`id`);
    96.  
    97. --
    98. -- Индексы таблицы `relations`
    99. --
    100. ALTER TABLE `relations`
    101.   ADD PRIMARY KEY (`id`);
    102.  
    103. --
    104. -- AUTO_INCREMENT для сохранённых таблиц
    105. --
    106.  
    107. --
    108. -- AUTO_INCREMENT для таблицы `pokazateli`
    109. --
    110. ALTER TABLE `pokazateli`
    111.   MODIFY `id` int(8) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
    112.  
    113. --
    114. -- AUTO_INCREMENT для таблицы `products`
    115. --
    116. ALTER TABLE `products`
    117.   MODIFY `id` int(8) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
    118.  
    119. --
    120. -- AUTO_INCREMENT для таблицы `relations`
    121. --
    122. ALTER TABLE `relations`
    123.   MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
    124. COMMIT;
     
  18. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    не очень понял чего хотите в результате
    но
    Код (Text):
    1. SELECT p.name_pokazatel, GROUP_CONCAT(pr.name_product) FROM pokazateli AS p
    2.     LEFT JOIN relations AS r ON p.id = r.pokazatel_id
    3.         LEFT JOIN products AS pr ON pr.id = r.product_id
    4. GROUP BY p.id
    дает что-то
    https://yadi.sk/d/n7ghr9AMCUvUGg
     
  19. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Судя по выводу неправильно делает. Пустой показатель - без продукции.
     
  20. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    а что надо то? результат то какой должен быть?
    --- Добавлено ---
    если пустой не должен выводиться - то

    Код (Text):
    1. SELECT p.name_pokazatel, GROUP_CONCAT(pr.name_product) FROM pokazateli AS p
    2.     JOIN relations AS r ON p.id = r.pokazatel_id
    3.         LEFT JOIN products AS pr ON pr.id = r.product_id
    4. GROUP BY p.id
     
  21. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    @ADSoft Мне нужно вытащить в одном запросе название показателя - одна строка, продукцию к этому показателю - вторая строка. Чтобы я мог в этом же запросе добавить ORDER BY <первая строка> или ORDER BY <вторая строка>. Ну то есть, сортировать запрос либо по названию показателя, либо по списку продукции.
    --- Добавлено ---
    Показатель должен выводиться всегда. А продукция - если есть.
     
  22. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Nerfed, не создавай ни себе ни нам "проблему молотка". Описывай сразу, что ты хочешь сделать на начальном этапе, а не финальную часть своего решения, которое может быть в корне неправильным.
    Скажу по секрету, что запросов без сортировки не бывает (99%).
    Ты можешь сортировать по названию показателя, но по группировке не сможешь, можно только отсортировать внутри каждой группы. И эти сортировки грубо говоря никак не влияют одна на другую.
     
  23. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Слушай, я попробовал вот этот твой запрос - у меня выдаёт другой результат. Я немного изменил запрос:
    Код (Text):
    1. SELECT p.name_pokazatel, GROUP_CONCAT(pr.name_product) AS `all_products` FROM pokazateli AS p
    2.     LEFT JOIN relations AS r ON p.id = r.pokazatel_id
    3.         LEFT JOIN products AS pr ON pr.id = r.product_id
    4. GROUP BY p.id
    5. ORDER BY `all_products`
    Тут вывод просто через var_export:

    [​IMG]
    Вроде работает как надо. Только я не понимаю как мне к этому запросу теперь добавить ещё один такой же. Продукция - это только пример. У меня кроме неё ещё 5 таблиц, которые нужно также присобачить в этот запрос. Например, есть регламенты:

    reglaments
    - id
    - name

    И будет например вторая связывающая таблица:
    relations_reg
    - id
    - pokazatel_id
    - reglament_id
    --- Добавлено ---
    Вроде из первого поста всё понятно. Мне просто нужно вывести список показателей таблицей. Первая колонка - название показателя. Вторая колонка - список продукции, который может быть не всегда. Третья колонка - регламенты, которые тоже могут быть не всегда и т.п. И всё это я хочу вывести одним запросом, склеив дочерние элементы показателя в строки, чтобы по ним можно было делать ORDER BY прямо в этом запросе.
     
  24. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Я немного причесал структуру.
    Код (Text):
    1. -- phpMyAdmin SQL Dump
    2. -- version 4.8.5
    3. -- https://www.phpmyadmin.net/
    4. --
    5. -- Хост: localhost
    6. -- Время создания: Дек 05 2019 г., 17:19
    7. -- Версия сервера: 5.7.25
    8. -- Версия PHP: 7.0.8
    9.  
    10. SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    11. SET AUTOCOMMIT = 0;
    12. START TRANSACTION;
    13. SET time_zone = "+00:00";
    14.  
    15. --
    16. -- База данных: `testy-test`
    17. --
    18.  
    19. -- --------------------------------------------------------
    20.  
    21. --
    22. -- Структура таблицы `pokazateli`
    23. --
    24.  
    25. CREATE TABLE `pokazateli` (
    26.   `id` int(8) NOT NULL,
    27.   `name_pokazatel` text NOT NULL COMMENT 'id названия показателя'
    28. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Показатели';
    29.  
    30. --
    31. -- Дамп данных таблицы `pokazateli`
    32. --
    33.  
    34. INSERT INTO `pokazateli` (`id`, `name_pokazatel`) VALUES
    35. (1, 'Ворсистость'),
    36. (2, 'Пустой');
    37.  
    38. -- --------------------------------------------------------
    39.  
    40. --
    41. -- Структура таблицы `products`
    42. --
    43.  
    44. CREATE TABLE `products` (
    45.   `id` int(8) NOT NULL,
    46.   `name_product` text NOT NULL COMMENT 'Наименование продукции'
    47. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Продукция';
    48.  
    49. --
    50. -- Дамп данных таблицы `products`
    51. --
    52.  
    53. INSERT INTO `products` (`id`, `name_product`) VALUES
    54. (1, 'Бабушкины носки'),
    55. (2, 'Свитера с катушками'),
    56. (3, 'Не должно выводиться');
    57.  
    58. -- --------------------------------------------------------
    59.  
    60. --
    61. -- Структура таблицы `reglaments`
    62. --
    63.  
    64. CREATE TABLE `reglaments` (
    65.   `id` int(11) NOT NULL,
    66.   `name_reglament` varchar(255) NOT NULL
    67. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    68.  
    69. --
    70. -- Дамп данных таблицы `reglaments`
    71. --
    72.  
    73. INSERT INTO `reglaments` (`id`, `name_reglament`) VALUES
    74. (1, 'первый'),
    75. (2, 'второй'),
    76. (3, 'третий'),
    77. (4, 'четвёртый');
    78.  
    79. -- --------------------------------------------------------
    80.  
    81. --
    82. -- Структура таблицы `rel_products`
    83. --
    84.  
    85. CREATE TABLE `rel_products` (
    86.   `id` int(11) NOT NULL,
    87.   `pokazatel_id` int(8) NOT NULL,
    88.   `product_id` int(8) NOT NULL
    89. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    90.  
    91. --
    92. -- Дамп данных таблицы `rel_products`
    93. --
    94.  
    95. INSERT INTO `rel_products` (`id`, `pokazatel_id`, `product_id`) VALUES
    96. (1, 1, 1),
    97. (2, 1, 2),
    98. (3, 2, 1);
    99.  
    100. -- --------------------------------------------------------
    101.  
    102. --
    103. -- Структура таблицы `rel_reglaments`
    104. --
    105.  
    106. CREATE TABLE `rel_reglaments` (
    107.   `id` int(11) NOT NULL,
    108.   `pokazatel_id` int(11) NOT NULL,
    109.   `reglament_id` int(11) NOT NULL
    110. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    111.  
    112. --
    113. -- Дамп данных таблицы `rel_reglaments`
    114. --
    115.  
    116. INSERT INTO `rel_reglaments` (`id`, `pokazatel_id`, `reglament_id`) VALUES
    117. (1, 2, 1),
    118. (2, 2, 3),
    119. (3, 1, 4);
    120.  
    121. --
    122. -- Индексы сохранённых таблиц
    123. --
    124.  
    125. --
    126. -- Индексы таблицы `pokazateli`
    127. --
    128. ALTER TABLE `pokazateli`
    129.   ADD PRIMARY KEY (`id`);
    130.  
    131. --
    132. -- Индексы таблицы `products`
    133. --
    134. ALTER TABLE `products`
    135.   ADD PRIMARY KEY (`id`);
    136.  
    137. --
    138. -- Индексы таблицы `reglaments`
    139. --
    140. ALTER TABLE `reglaments`
    141.   ADD PRIMARY KEY (`id`);
    142.  
    143. --
    144. -- Индексы таблицы `rel_products`
    145. --
    146. ALTER TABLE `rel_products`
    147.   ADD PRIMARY KEY (`id`);
    148.  
    149. --
    150. -- Индексы таблицы `rel_reglaments`
    151. --
    152. ALTER TABLE `rel_reglaments`
    153.   ADD PRIMARY KEY (`id`);
    154.  
    155. --
    156. -- AUTO_INCREMENT для сохранённых таблиц
    157. --
    158.  
    159. --
    160. -- AUTO_INCREMENT для таблицы `pokazateli`
    161. --
    162. ALTER TABLE `pokazateli`
    163.   MODIFY `id` int(8) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
    164.  
    165. --
    166. -- AUTO_INCREMENT для таблицы `products`
    167. --
    168. ALTER TABLE `products`
    169.   MODIFY `id` int(8) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
    170.  
    171. --
    172. -- AUTO_INCREMENT для таблицы `reglaments`
    173. --
    174. ALTER TABLE `reglaments`
    175.   MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
    176.  
    177. --
    178. -- AUTO_INCREMENT для таблицы `rel_products`
    179. --
    180. ALTER TABLE `rel_products`
    181.   MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
    182.  
    183. --
    184. -- AUTO_INCREMENT для таблицы `rel_reglaments`
    185. --
    186. ALTER TABLE `rel_reglaments`
    187.   MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
    188. COMMIT;
    Попробовал сделать ещё с таблицей регламентов так - не работает.
    PHP:
    1. SELECT p.name_pokazatel, GROUP_CONCAT(pr.name_product) AS `all_products`, GROUP_CONCAT(reg.name_reglament) AS `all_reglaments`
    2. FROM pokazateli AS p
    3.    LEFT JOIN rel_products AS r ON p.id = r.pokazatel_id
    4.       LEFT JOIN products AS pr ON pr.id = r.product_id
    5.    
    6.    LEFT JOIN rel_reglaments AS r2 ON p.id = r2.pokazatel_id
    7.       LEFT JOIN reglaments AS reg ON reg.id = r2.reglament_id
    8.    
    9. GROUP BY p.id
    10. ORDER BY `all_products`
    Выводит лишние результаты.

    [​IMG]
    Должно быть:
    Пустой
    -- Бабушкины носки
    -- первый,третий

    Ворсистость
    -- Бабушкины носки,Свитера с катушками
    -- четвёртый

    Как я понимаю, это из-за GROUP BY.
     
    #24 Nerfed, 5 дек 2019
    Последнее редактирование: 5 дек 2019
  25. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    нет, это из-за того что ты не умеешь SQL))
    его, как ни странно это звучит, но тоже надо изучать и желательно как отдельный язык программирования, без этого так и будешь лепить "горбатого к стенке". Нельзя просто скописастить половину запроса и прилепить. Я уже сказал, сначала надо создать архитектуру БД, и не просто "причесать" от балды, а опираясь на правила и законы. Чётко определить отношения. И понимать что и откуда выбирать и как это будет выглядеть в итоге. И как из этого уже получить желаемое.