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

таблица objects
id, name, priority, group_id
1, объект1, 90, 0
2, объект2, 50, 0
3, объект3, 10, 1
4, объект4, 10, 1

таблица groups
id, name, priority
1, группа1, 80

Нужно из objects вывести объекты с группировкой по group_id. Но те, объекты, у которых group_id = 0, группировать не нужно. При этом нужно сортировать результат по priority и использовать LIMIT для постраничной разбивки.

т.е. должен быть такой результат вывода на страницу:

объект1
группа1
объект2

Пробую использовать UNION:

(
SELECT SQL_CALC_FOUND_ROWS object.*, objects.priority AS full_priority
WHERE group_id = 0
ORDER BY priority DESC
)
UNION ALL
(
SELECT object.*, groups.priority AS full_priority
WHERE group_id != 0
GROUP BY group_id
ORDER BY priority DESC
)
ORDER BY full_priority DESC LIMIT 0, 2

Далее в переборке идет запрос для получения инфы о группе, если group_id != 0 и всё выводится в нужном виде с постраничной разбивкой. НО! Если во втором запросе результатов не найдено(допустим, что у всех objects.group_id = 0), то возвращается пустой общий результат. Не понимаю, почему так происходит?
Буду благодарен за помощь. Может быть подскажете более лучшее решение?
...
Рейтинг: 0 / 0
проблема с UNION
    #38841828
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я фигею в этом зоопарке! как можно вообще что-то получить осмысленное при тотальном отсутствии секции FROM?
...
Рейтинг: 0 / 0
проблема с UNION
    #38841882
allexp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, поправляю

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
(
SELECT SQL_CALC_FOUND_ROWS object.*, objects.priority AS full_priority
FROM objects
WHERE group_id = 0
ORDER BY priority DESC
)
UNION ALL
(
SELECT object.*, groups.priority AS full_priority
FROM objects
JOIN groups ON object.group_id = groups.id
WHERE group_id != 0
GROUP BY group_id
ORDER BY priority DESC
)
ORDER BY full_priority DESC LIMIT 0, 2

Модератор: Пожалуйста, пользуйтесь тегами для оформления своих постов. Читать серые портянки никому не интересно.
...
Рейтинг: 0 / 0
проблема с UNION
    #38841910
allexp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вобще, это конечно упрощенная схема таблиц, и оказывается тут все работает нормально. Значит что-то не так в моем рабочем варианте. Буду проверять, может и не стоило тему создавать. Вопрос пока снимается.
...
Рейтинг: 0 / 0
проблема с UNION
    #38841913
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
mysql> CREATE TABLE objects (
    -> id INT,
    -> name TEXT,
    -> priority INT,
    -> group_id INT
    -> );
Query OK, 0 rows affected (3.01 sec)

mysql> INSERT INTO objects (id, name, priority, group_id) VALUES
    -> (1, 'объект1', 90, 0),
    -> (2, 'объект2', 50, 0),
    -> (3, 'объект3', 10, 1),
    -> (4, 'объект4', 10, 1);
Query OK, 4 rows affected (0.59 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE groups (
    -> id INT,
    -> name TEXT,
    -> priority INT
    -> );
Query OK, 0 rows affected (1.44 sec)

mysql> INSERT INTO groups (id, name, priority) VALUES
    -> (1, 'группа1', 80);
Query OK, 1 row affected (0.07 sec)

mysql> SELECT * FROM objects;
+------+---------------+----------+----------+
| id   | name          | priority | group_id |
+------+---------------+----------+----------+
|    1 | объект1       |       90 |        0 |
|    2 | объект2       |       50 |        0 |
|    3 | объект3       |       10 |        1 |
|    4 | объект4       |       10 |        1 |
+------+---------------+----------+----------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM groups;
+------+---------------+----------+
| id   | name          | priority |
+------+---------------+----------+
|    1 | группа1       |       80 |
+------+---------------+----------+
1 row in set (0.03 sec)

mysql> (
    -> SELECT SQL_CALC_FOUND_ROWS objects.*, objects.priority AS full_priority
    -> FROM objects
    -> WHERE group_id = 0
    -> ORDER BY priority DESC
    -> )
    -> UNION ALL
    -> (
    -> SELECT objects.*, groups.priority AS full_priority
    -> FROM objects
    -> JOIN groups ON objects.group_id = groups.id
    -> WHERE group_id != 0
    -> GROUP BY group_id
    -> ORDER BY priority DESC
    -> )
    -> ORDER BY full_priority DESC; -- LIMIT 0, 2
+------+---------------+----------+----------+---------------+
| id   | name          | priority | group_id | full_priority |
+------+---------------+----------+----------+---------------+
|    1 | объект1       |       90 |        0 |            90 |
|    3 | объект3       |       10 |        1 |            80 |
|    2 | объект2       |       50 |        0 |            50 |
+------+---------------+----------+----------+---------------+
3 rows in set (0.32 sec)


allexpНО! Если во втором запросе результатов не найдено(допустим, что у всех objects.group_id = 0), то возвращается пустой общий результат.
Следи за руками...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
mysql> UPDATE objects SET group_id = 0;
Query OK, 2 rows affected (0.30 sec)
Rows matched: 4  Changed: 2  Warnings: 0

mysql> SELECT * FROM objects;
+------+---------------+----------+----------+
| id   | name          | priority | group_id |
+------+---------------+----------+----------+
|    1 | объект1       |       90 |        0 |
|    2 | объект2       |       50 |        0 |
|    3 | объект3       |       10 |        0 |
|    4 | объект4       |       10 |        0 |
+------+---------------+----------+----------+
4 rows in set (0.00 sec)

mysql> (
    -> SELECT SQL_CALC_FOUND_ROWS objects.*, objects.priority AS full_priority
    -> FROM objects
    -> WHERE group_id = 0
    -> ORDER BY priority DESC
    -> )
    -> UNION ALL
    -> (
    -> SELECT objects.*, groups.priority AS full_priority
    -> FROM objects
    -> JOIN groups ON objects.group_id = groups.id
    -> WHERE group_id != 0
    -> GROUP BY group_id
    -> ORDER BY priority DESC
    -> )
    -> ORDER BY full_priority DESC; -- LIMIT 0, 2
+------+---------------+----------+----------+---------------+
| id   | name          | priority | group_id | full_priority |
+------+---------------+----------+----------+---------------+
|    1 | объект1       |       90 |        0 |            90 |
|    2 | объект2       |       50 |        0 |            50 |
|    3 | объект3       |       10 |        0 |            10 |
|    4 | объект4       |       10 |        0 |            10 |
+------+---------------+----------+----------+---------------+
4 rows in set (0.17 sec)

mysql>
...
Рейтинг: 0 / 0
проблема с UNION
    #38841933
allexp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь за беспокойство. Да, действительно, с запросом все в порядке. Причина в моей невнимательности, в рабочей версии запрос длинный многострочный, просто случайно получилось, что первая часть запроса терялась, а работала только вторая.
Тему можно закрыть/снести.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / проблема с UNION
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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