Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / ORDER BY в UNION / 8 сообщений из 8, страница 1 из 1
10.05.2015, 23:08:46
    #38955522
michail_kul
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY в UNION
Имеем таблицу

CREATE DATABASE Solution;

CREATE TABLE Solution.table_costs (
id SMALLINT NOT NULL AUTO_INCREMENT,
d_f DATE NOT NULL,
price INT(15) NOT NULL,
category VARCHAR(25) NOT NULL,
PRIMARY KEY(id));

INSERT INTO Solution.table_costs VALUES(null, '2015-01-15', 31, ‘transport’),
(null, '2015-01-16', 31, ‘transport’),
(null, '2015-01-17', 30, ‘tobaco’),
(null, '2015-02-01', 31, ‘transport’),
(null, '2015-02-14', 32, ‘beer’),
(null, '2015-01-01', 30, ‘other’);



В результате выборки мы должны получить 3 категории(`category`) с сортировкой по дате(`d_f`).
Первым делом идут категории с точным совпадением цены(`price`), следом с отклонением плюс-минус 5% от цены.

Запрос:


(
SELECT `category`
FROM(
SELECT `category` FROM Solution.table_costs
WHERE `price`=31
ORDER BY `d_f` DESC)
a
)
UNION
(
SELECT `category`
FROM(
SELECT `category`
FROM Solution.table_costs
WHERE `price`>31 * 0.95 AND `price`<31 * 1.05
ORDER BY `d_f` DESC)
b
)
LIMIT 3;



Зачем нужны переменные a и b?
Можно ли обойтись без них?
Правильно ли выполнен запрос?
...
Рейтинг: 0 / 0
11.05.2015, 08:31:20
    #38955560
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY в UNION
Во-первых, union all, во-вторых, не факт, что даже union all без внешней сортировки даст то, что надо, в-третьих, да, можно, в-четвёртых, нет, неправильно.
...
Рейтинг: 0 / 0
11.05.2015, 11:49:51
    #38955640
michail_kul
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY в UNION
tanglirВо-первых, union all, во-вторых, не факт, что даже union all без внешней сортировки даст то, что надо, в-третьих, да, можно, в-четвёртых, нет, неправильно.

1. Почему UNION ALL?
2. Как правильно сделать внешнюю сортировку?
3. Как обойтись без переменных а и b?
4. В чём ошибка?
...
Рейтинг: 0 / 0
11.05.2015, 12:51:29
    #38955679
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY в UNION
michail_kul,

1) a и b нужны по правилам синтаксиса подзапроса
https://dev.mysql.com/doc/refman/5.6/en/from-clause-subqueries.html
2) можно не использовать подзапрос
3) неправильно. почему бы вам не попробовать запрос на вашей же табличке?
а) по-моему, в подзапросе FROM сортировка не разрешается
б) я бы добавила дату, возможно тогда вы бы и получили, то что вам нужно
...
Рейтинг: 0 / 0
11.05.2015, 13:07:19
    #38955687
michail_kul
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY в UNION
mini.weblabmichail_kul,

1) a и b нужны по правилам синтаксиса подзапроса
https://dev.mysql.com/doc/refman/5.6/en/from-clause-subqueries.html
2) можно не использовать подзапрос
3) неправильно. почему бы вам не попробовать запрос на вашей же табличке?
а) по-моему, в подзапросе FROM сортировка не разрешается
б) я бы добавила дату, возможно тогда вы бы и получили, то что вам нужно

1. Понял
2.Как написать тоже без него?
3. У меня всё замечательно работает с этим запросом.
а. Тем не менее сортирует.
б. Не понял. Куда добавила бы?
...
Рейтинг: 0 / 0
11.05.2015, 13:23:03
    #38955693
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY в UNION
michail_kul,
1) добавляем дату и убираем подзапрос
(
SELECT `category`, `d_f`
FROM Solution.table_costs
WHERE `price`=31
ORDER BY `d_f` DESC
)
UNION
(
SELECT `category`, `d_f`
FROM Solution.table_costs
WHERE `price`>31 * 0.95 AND `price`<31 * 1.05
ORDER BY `d_f` DESC
)

2) попробуйте добавить в таблицу
INSERT INTO Solution.table_costs VALUES
(null, '2015-01-19', 30, ‘transport’),
(null, '2015-02-16', 32, ‘transport’)

что возвращает запрос?
...
Рейтинг: 0 / 0
11.05.2015, 16:05:53
    #38955789
michail_kul
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY в UNION
mini.weblabmichail_kul,
1) добавляем дату и убираем подзапрос
(
SELECT `category`, `d_f`
FROM Solution.table_costs
WHERE `price`=31
ORDER BY `d_f` DESC
)
UNION
(
SELECT `category`, `d_f`
FROM Solution.table_costs
WHERE `price`>31 * 0.95 AND `price`<31 * 1.05
ORDER BY `d_f` DESC
)

2) попробуйте добавить в таблицу
INSERT INTO Solution.table_costs VALUES
(null, '2015-01-19', 30, ‘transport’),
(null, '2015-02-16', 32, ‘transport’)

что возвращает запрос?

1) Запрос возвращает во-первых не уникальные значения, во-вторых не отсортированные по дате.

2) Добавил.. ничего не изменилось.
...
Рейтинг: 0 / 0
11.05.2015, 17:07:49
    #38955829
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORDER BY в UNION
michail_kul,

ох, неправильно поняла, что вы хотели
(я думала, что если транспорт, например, в первой и во второй категории, то его тоже нужно выводить 2 раза)

1) ваш запрос возвращает список категорий: transport, beer, tobacco (вроде все верно)
2) правильность запроса можно проверить, выведя дополнительно d_f и price:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
(
SELECT category, d_f, price
FROM(
SELECT category, d_f, price FROM table_costs
WHERE price=31
ORDER BY d_f DESC)
a
)
UNION
(
SELECT category, d_f, price
FROM(
SELECT category, d_f, price
FROM table_costs
WHERE price>31 * 0.95 AND price<31 * 1.05
ORDER BY d_f DESC)
b
);



3) еще благодаря вам узнала, почему не работает вот это =)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
(
SELECT category, d_f, price
FROM table_costs
WHERE price=31
ORDER by d_f desc
)
UNION
(
SELECT category, d_f, price
FROM table_costs
WHERE price>31 * 0.95 AND price<31 * 1.05
ORDER BY d_f desc
);



вот, https://dev.mysql.com/doc/refman/5.6/en/union.html
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / ORDER BY в UNION / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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