powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложное объеденение запросов
14 сообщений из 14, страница 1 из 1
Сложное объеденение запросов
    #39239586
RtsAmber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер, нужна помощь по выборке из базы данных.

Сейчас я делаю 4 выборки из БД в разные массивы, а потом склеиваю их в один. Нельзя ли объединить в 1 запрос?

суть склейки мне нужно строго чтобы шли результаты в определенном порядке

допустим есть таблица которая содержит 6 столбцов: id, name, a, b, с, d

мне нужно чтобы результирующий массива был построен таким образом (по сути так выглядят 4 выборки):

сначала: a>0 order by name ASC
потом: a=0, b>0 order by name ASC
потом: a=0, b=0, c>0 order by name ASC
потом: a=0, b=0, c=0, d>0 order by name ASC

есть ли способ объединить в один запрос?

если я правильно понимаю - при использовании UNION он может смешать результаты в конечном массиве - это мне категорически не подходит
...
Рейтинг: 0 / 0
Сложное объеденение запросов
    #39239630
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RtsAmberесли я правильно понимаю - при использовании UNION он может смешать результаты в конечном массиве - это мне категорически не подходита вы добавьте в каждую выборку ещё одно поле - номер выборки
и отсортируйте потом по нему (ну и по name, конечно)

хотя... зачем всё это? можно же сразу
Код: sql
1.
order by a=0, b=0, c=0, d=0, name
...
Рейтинг: 0 / 0
Сложное объеденение запросов
    #39239725
RtsAmber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, спасибо за ответ. Я правильно Вас понял:



авторSELECT *
FROM `table`
ORDER BY `table`.`a` = '0', `table`.`b` = '0', `table`.`c` = '0', `table`.`d` = '0'

или через where все условия по или перечислить?
...
Рейтинг: 0 / 0
Сложное объеденение запросов
    #39239755
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А попробовать?
...
Рейтинг: 0 / 0
Сложное объеденение запросов
    #39239759
RtsAmber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извините, поспешно ответил, в итоге получился вот такой запрос (сообщение выше отредактировать не могу)

авторSELECT *
FROM `table`
WHERE `table`.`a` > '0'
UNION
SELECT *
FROM `table`
WHERE `table`.`a` = '0'
AND `table`.`b` > '0'
UNION
SELECT *
FROM `table`
WHERE `table`.`a` = '0'
AND `table`.`b` = '0'
AND `table`.`c` > '0'
UNION
SELECT *
FROM `table`
WHERE `table`.`a` = '0'
AND `table`.`b` = '0'
AND `table`.`c` = '0'
AND `table`.`d` > '0'
ORDER BY `a` = '0', `b` = '0', `c` = '0', `d`='0'

пока для простоты без сортировки по имени
сейчас тестирую на БД, отпишусь в теме

p.s. БД большая, порядка 20k записей, думаю очевидно что a,b,c,d просто назвал в примере для простоты
...
Рейтинг: 0 / 0
Сложное объеденение запросов
    #39239775
RtsAmber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для проверки создал простенькую БД как расписал в примере, все работает - большое спасибо tanglir за помощь.
...
Рейтинг: 0 / 0
Сложное объеденение запросов
    #39239800
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RtsAmber,

union all надо, а не просто union.

у тебя правда и так будет работать, раз ты добавил колонку с номером выборки, но лишние операции не нужны никому.
...
Рейтинг: 0 / 0
Сложное объеденение запросов
    #39240235
RtsAmber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv, спасибо. Теперь так и делаю.


Не подскажите еще такую вещь:

если выполнять запрос,


Код: sql
1.
 SELECT l.`sys_product_id` FROM `pref_sys_products_ru_ru` as l JOIN `pref_sys_products` AS p using (`sys_product_id`) LEFT JOIN `pref_sys_product_categories` as pc ON p.`sys_product_id` = `pc`.`sys_product_id` LEFT JOIN `pref_sys_categories_ru_ru` as c ON c.`sys_category_id` = `pc`.`sys_category_id` LEFT JOIN `pref_sys_product_shoppergroups` ON p.`sys_product_id` = `pref_sys_product_shoppergroups`.`sys_product_id` LEFT OUTER JOIN `pref_sys_shoppergroups` as s ON s.`sys_shoppergroup_id` = `pref_sys_product_shoppergroups`.`sys_shoppergroup_id` WHERE ( p.`published`="1" AND `pc`.`sys_category_id` IN(98) AND `pc`.`sys_category_id` > 0 AND ( s.`sys_shoppergroup_id`= "1" OR s.`sys_shoppergroup_id` IS NULL ) AND product_width = "0" AND product_length = "0" AND product_height = "0" AND product_weight > "0") ORDER BY product_name ASC 



запрос выполняется успешно. Когда добавляю UNION ALL

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT l.`sys_product_id` FROM `pref_sys_products_ru_ru` as l JOIN `pref_sys_products` AS p using (`sys_product_id`) LEFT JOIN `pref_sys_product_categories` as pc ON p.`sys_product_id` = `pc`.`sys_product_id` LEFT JOIN `pref_sys_categories_ru_ru` as c ON c.`sys_category_id` = `pc`.`sys_category_id` LEFT JOIN `pref_sys_product_shoppergroups` ON p.`sys_product_id` = `pref_sys_product_shoppergroups`.`sys_product_id` LEFT OUTER JOIN `pref_sys_shoppergroups` as s ON s.`sys_shoppergroup_id` = `pref_sys_product_shoppergroups`.`sys_shoppergroup_id` WHERE ( p.`published`="1" AND `pc`.`sys_category_id` IN(98) AND `pc`.`sys_category_id` > 0 AND ( s.`sys_shoppergroup_id`= "1" OR s.`sys_shoppergroup_id` IS NULL ) AND product_width = "0" AND product_length = "0" AND product_height = "0" AND product_weight > "0") 


UNION ALL

 SELECT l.`sys_product_id` FROM `pref_sys_products_ru_ru` as l JOIN `pref_sys_products` AS p using (`sys_product_id`) LEFT JOIN `pref_sys_product_categories` as pc ON p.`sys_product_id` = `pc`.`sys_product_id` LEFT JOIN `pref_sys_categories_ru_ru` as c ON c.`sys_category_id` = `pc`.`sys_category_id` LEFT JOIN `pref_sys_product_shoppergroups` ON p.`sys_product_id` = `pref_sys_product_shoppergroups`.`sys_product_id` LEFT OUTER JOIN `pref_sys_shoppergroups` as s ON s.`sys_shoppergroup_id` = `pref_sys_product_shoppergroups`.`sys_shoppergroup_id` WHERE ( p.`published`="1" AND `pc`.`sys_category_id` IN(98) AND `pc`.`sys_category_id` > 0 AND ( s.`sys_shoppergroup_id`= "1" OR s.`sys_shoppergroup_id` IS NULL ) AND product_width > "0")

ORDER BY product_name ASC 



получаю ошибку, #1054 - Unknown column product_name in 'order clause'

подскажите, пожалуйста как лечить

product_name входит в таблицу pref_sys_products_ru_ru
...
Рейтинг: 0 / 0
Сложное объеденение запросов
    #39240259
RtsAmber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавлю:

запросы почти одинаковые, отличается немного WHERE
FROM одинаковый для обоих запросов
...
Рейтинг: 0 / 0
Сложное объеденение запросов
    #39240266
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RtsAmberполучаю ошибку, #1054 - Unknown column product_name in 'order clause'Выходной набор состоит из единственного поля sys_product_id.
...
Рейтинг: 0 / 0
Сложное объеденение запросов
    #39240291
RtsAmber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaRtsAmberполучаю ошибку, #1054 - Unknown column product_name in 'order clause'Выходной набор состоит из единственного поля sys_product_id.

Да, но это поле успешно сортируется с учетом имени другого поля (там соединение через JOIN присутствует, поле product_id и product_name входят в одну таблицу. Сам запрос правильный, когда применяю без UNION ALL. Проблема возникает после склейки запросов.

Пробую для второго запроса использовать другие p.,s.,l .... пока без результатно
...
Рейтинг: 0 / 0
Сложное объеденение запросов
    #39240313
RtsAmber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, Вы были правы. При использовании UNION ALL и order by приходиться перечислять все переменные, которые входят в order by.

Жаль, что в финальную выборку будут входить не нужные поля... Нужен был только id
...
Рейтинг: 0 / 0
Сложное объеденение запросов
    #39240365
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RtsAmber , если подзапросы, входящие в UNION, не обрамляются скобками и не получают имён-алиасов, они от этого не перестают быть подзапросами.

RtsAmberЖаль, что в финальную выборку будут входить не нужные поля... Нужен был только id
Очень странно, что поле, которое определяет порядок записей, названо "ненужным".
...
Рейтинг: 0 / 0
Сложное объеденение запросов
    #39240519
RtsAmberЖаль, что в финальную выборку будут входить не нужные поля... Нужен был только id
В суть вашего обсуждения не вникал, так что могу попасть пальцем в небо, но обычно выделить из результата только нужные поля можно надзапросом:
Код: sql
1.
2.
3.
4.
SELECT `id`  -- перечисление только нужных полей
FROM (
select ... union select ... union select  -- настоящий запрос с лишними полями
) as subquery0;
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложное объеденение запросов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]