|
|
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
Привет всем, есть таблица с товарами, есть 2 прайс листа - один для нормальных товаров, другой для уцененных. В зависимости, побит ли жизнью товар или нет нужно выбирать цену (или прайс?). А если цены нет то как отфильтровать записи? Приведу пример своего запроса (не работает): SELECT * FROM product LEFT JOIN price normal_price on product.article=normal_price.article and normal_price.id_pricelist=1 LEFT JOIN price markdown_price on product.article=markdown_price.article and markdown_price.id_pricelist=2 GROUP BY product.id HAVING IF(product.broken=1 OR product.damaged=1, markdown_price.low_value, normal_price.low_value) > 0 Помогите плиз написать верный запрос... и можно ли вообще без HAVING обойтись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 10:19 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
Нафига вообще группировка? неужели в прайсе есть дубли по товару? Если да - какой смысл получать рандом? причём даже без гарантии, что из одной записи... А вообще - начните с чёткого формулирования задачи. Тот поток сознания, что выше, на задачу не тянет даже приблизительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 10:31 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
Akina, Задача: вывод списка товаров, цена выводится в зависимости от состояния товара. Если товар с повреждениями то цену брать из прайс листа 2. Если у битого товара не выставлена цена в прайсе №2 не выводить товар в списке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 10:51 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
polkiloЗадача: вывод списка товаров, цена выводится в зависимости от состояния товара. Если товар с повреждениями то цену брать из прайс листа 2. Если у битого товара не выставлена цена в прайсе №2 не выводить товар в списке. Мля... Как определить, что товар "с повреждениями"? на потолок поглядеть? Структуры исходных данных с пояснениями - в студию (лишнее для задачи - поскипать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 11:03 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
Akina, За "повреждения" отвечают поля product.broken и product.damaged. Вот таблица товаров: CREATE TABLE ecs_20151118.esys_product ( id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, article char(20) NOT NULL COMMENT 'Артикул', id_group int(11) UNSIGNED DEFAULT NULL COMMENT 'Группа', name varchar(255) NOT NULL COMMENT 'Полное название', description text NOT NULL COMMENT 'Описание', broken tinyint(4) NOT NULL COMMENT 'С трещиной', damaged tinyint(4) NOT NULL COMMENT 'Повреждения', PRIMARY KEY (id), INDEX article (article) ) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT = 'Товары'; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 11:19 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
Таблица цен: CREATE TABLE ecs_20151118.esys_price ( article char(20) NOT NULL COMMENT 'Артикул товара', id_pricelist int(11) UNSIGNED NOT NULL COMMENT 'Прайс лист', value decimal(10, 2) UNSIGNED NOT NULL COMMENT 'Цена', PRIMARY KEY (article_product, id_pricelist) ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT = 'Цены'; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 11:24 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
polkiloПривет всем, есть таблица с товарами, есть 2 прайс листа - один для нормальных товаров, другой для уцененных. В зависимости, побит ли жизнью товар или нет нужно выбирать цену (или прайс?). А если цены нет то как отфильтровать записи? Приведу пример своего запроса (не работает): SELECT * FROM product LEFT JOIN price normal_price on product.article=normal_price.article and normal_price.id_pricelist=1 LEFT JOIN price markdown_price on product.article=markdown_price.article and markdown_price.id_pricelist=2 GROUP BY product.id HAVING IF(product.broken=1 OR product.damaged=1, markdown_price.low_value, normal_price.low_value) > 0 Помогите плиз написать верный запрос... и можно ли вообще без HAVING обойтись? нужно обходиться без group by и having ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 11:31 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
MasterZiv, два left join плюс case-выражение для цены. никаких group by не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 11:33 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
С кейсами написал запрос, но как убрать GROUP BY и HAVING? SELECT products.*, CASE WHEN (products.article_markdown is NOT NULL OR products.badpack>0 OR products.surplus>0 OR products.damaged>0 OR products.repaired>0 OR products.used>0) THEN (SELECT low_value FROM esys_price WHERE article_product=products.article AND id_pricelist=16) ELSE (SELECT low_value FROM esys_price WHERE article_product=products.article AND id_pricelist=90) END AS price FROM esys_product products GROUP BY products.id HAVING price>0 ORDER BY price ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 11:37 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
Попробовал вот так: SELECT product.*, CASE WHEN (product.broken>0 OR product.damaged>0) THEN (SELECT value FROM price WHERE article=product.article AND id_pricelist=2) ELSE (SELECT value FROM price WHERE article=product.article AND id_pricelist=1) END AS price FROM product WHERE price>0 Выдает ошибку: 4 Unknown column 'price' in 'where clause' SQL9.sql 6 16 Where не понимает алиасов, как быть, растолкуйте пожалуйста... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 11:44 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
Связывание надо производить с учётом поля "повреждения". Т.е. типа Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Ну а цену выводить, используя COALESCE, если не устраивает NULL для отсутствующих. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 12:33 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
Akina, Огромное Вам спасибо!!! Вы гений ;) Благодаря Вам наконец то дошло, как работает JOIN! Здоровья Вам и удачи =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 12:48 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
Akina, А так можно? Я думал будет быстро работать а на деле тормоза, подскажите, пожалуйста, может для таблицы Price создать какие-нить ключи? FROM product LEFT JOIN price ON product.id=price.id AND ( ((product.broken=1 OR product.damaged=1) AND price.id_pricelist=2) OR (product.broken=0 AND product.damaged=0 AND price.id_pricelist=1) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2016, 12:32 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
polkiloЯ думал будет быстро работать а на деле тормоза Ясен пень - индексы-то побоку... Лучше, конечно, переписать на UNION, чтобы избавиться от OR. Один подзапрос - один набор фильтров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2016, 12:40 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
Akina, То есть никаким индексами это дело не ускорить? Вот у меня была мысль про UNION, как то так: ( -- нормальные товары SELECT * FROM product JOIN price ON product.id=price.product_id and price.id_pricelist=1 WHERE product.broken=0 and product.damaged=0 and price.value>0 ) UNION ( -- покалеченные товары SELECT * FROM product JOIN price ON product.id=price.product_id and price.id_pricelist=2 WHERE (product.broken=1 or product.damaged=1) and price.value>0 ) LIMIT 30 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2016, 12:59 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
polkiloкак то так: Нет, не так. Во втором подзапросе OR. Поделите его на два. И замените звёзды на конкретный список полей. PS. Используйте тег SRC для кода запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2016, 13:02 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
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. Получается, что если в товаре 5 полей, содержащих информацию по типу повреждения, то будет дополнительно 5 union'ов. Может я неправильно спроектировал базу? Подскажите, пожалуйста... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2016, 13:17 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
polkiloТак? Наверное, всё-таки UNION ALL. Или может быть broken=1 и damaged=1 одновременно? polkiloПолучается, что если в товаре 5 полей, содержащих информацию по типу повреждения, то будет дополнительно 5 union'ов. Может я неправильно спроектировал базу? Ну в общем денормализация налицо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2016, 15:05 |
|
||
|
Фильтрация выборки
|
|||
|---|---|---|---|
|
#18+
Akina, Может тогда сделать таблицу с перечислением уценки? например такую: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. а в таблице товаров создать поле с внешним ключом к этой таблице (product.id_markdown => product_markdown.id_product) Тогда можно будет написать запрос к товарам с ценой: Код: sql 1. 2. 3. 4. 5. 6. Но опять же в итоге выборка будет по условию OR... что же делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2016, 14:12 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39149448&tid=1832249]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
15ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 303ms |

| 0 / 0 |
