Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Выборка из таблици товаров по самому максимальному рейтингу магазина, рейтинг мазаницов если есть одиноковые, выборка уже по минимальной цене
Форумы портала PHP.SU » Серверное администрирование » Администрирование БД » Выборка из таблици товаров по самому максимальному рейтингу магазина, рейтинг мазаницов если есть одиноковые, выборка уже по минимальной цене

Страниц (1): [1]
 

1. fdr21 - 12 Апреля, 2013 - 13:13:29 - перейти к сообщению
Всем привет, нужна помошь.

Имеется следующая таблица товаров
Таблица: products

её колонки
products_id - идентификатор продукции
repairs_id - идентификатор запчасти
products_price - цена продукции
shops_id - магазин
shops_rating - рейтинг маназина

данные

products_id | repairs_id | products_price | shops_id | shops_rating
1 | 1 | 100 | 1 | 5
2 | 1 | 50 | 2 | 3
3 | 2 | 100 | 1 | 5
4 | 2 | 90 | 3 | 5

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

products_id | repairs_id | products_price | shops_id | shops_rating
1 | 1 | 100 | 1 | 5
4 | 2 | 90 | 3 | 5

Можно это как то организовать спомошью SQL запроса?
2. Zuldek - 12 Апреля, 2013 - 13:26:35 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM products ORDER BY shops_rating DESC, products_price ASC
3. fdr21 - 12 Апреля, 2013 - 13:42:51 - перейти к сообщению
Zuldek пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM products ORDER BY shops_rating DESC, products_price ASC

По данному запросу я получу все строки, а мне нужно что бы дублирование не было, что бы была группировка по repairs_id - идентификатор запчасти, что бы одна и та же зап-часть не дублировалась

Есть следующий SQL код

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.         t1.products_id,
  3.         t1.repairs_id, t1.products_price,
  4.         t1.shops_id, t1.shops_rating
  5.        
  6.     FROM
  7.         (SELECT repairs_id, MIN(products_price) AS products_price
  8.                 FROM `products`
  9.                 GROUP BY repairs_id
  10.          ) t2
  11.        
  12.     JOIN
  13.         `products` t1 USING(repairs_id, products_price)

Он выбирает товары с самой минимальной ценой.
2 | 1 | 50 | 2 | 3
4 | 2 | 90 | 3 | 5

Рейтинг магазина не учитывается, а нужно что бы для начало было по рейтингу
4. Zuldek - 12 Апреля, 2013 - 16:32:06 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1.     SELECT * FROM products GROUP BY  repairs_id  ORDER BY shops_rating DESC, products_price ASC
5. fdr21 - 13 Апреля, 2013 - 08:27:39 - перейти к сообщению
Zuldek пишет:
CODE (SQL):
скопировать код в буфер обмена
  1.     SELECT * FROM products GROUP BY  repairs_id  ORDER BY shops_rating DESC, products_price ASC


к сожалению это тоже не подходит.

CODE (SQL):
скопировать код в буфер обмена
  1. mysql> SELECT * FROM products;
  2. +-------------+------------+----------------+----------+--------------+
  3. | products_id | repairs_id | products_price | shops_id | shops_rating |
  4. +-------------+------------+----------------+----------+--------------+
  5. |           1 |          1 |            100 |        1 |            9 |
  6. |           2 |          1 |             50 |        2 |            5 |
  7. |           3 |          2 |            100 |        1 |            9 |
  8. |           4 |          2 |             75 |        3 |           10 |
  9. +-------------+------------+----------------+----------+--------------+
  10. 4 rows IN SET (0.00 sec)
  11.  
  12. mysql> SELECT * FROM products GROUP BY  repairs_id  ORDER BY shops_rating DESC, products_price ASC;
  13. +-------------+------------+----------------+----------+--------------+
  14. | products_id | repairs_id | products_price | shops_id | shops_rating |
  15. +-------------+------------+----------------+----------+--------------+
  16. |           1 |          1 |            100 |        1 |            9 |
  17. |           3 |          2 |            100 |        1 |            9 |
  18. +-------------+------------+----------------+----------+--------------+
  19. 2 rows IN SET (0.00 sec)


группировка, сортировка не правильно происходит
По идее правильный вариант будет если он выберит

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. +-------------+------------+----------------+----------+--------------+
  3. | products_id | repairs_id | products_price | shops_id | shops_rating |
  4. +-------------+------------+----------------+----------+--------------+
  5. |           1 |          1 |            100 |        1 |            9 |
  6. |           4 |          2 |             75 |        3 |           10 |
  7. +-------------+------------+----------------+----------+--------------+
  8.  


надо как то все закрутить, уже второй день голову ломаю Однако

Решение найдено.
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT
  3.   t1.products_id,
  4.      t1.repairs_id, t1.products_price,
  5.      t1.shops_id, t1.shops_rating
  6.  FROM
  7.   (SELECT repairs_id, max(shops_rating * 100500 - products_price) AS xz
  8.           FROM `products`
  9.           GROUP BY repairs_id
  10.   ) t2
  11.   JOIN `products` t1
  12. ON t1.repairs_id=t2.repairs_id AND t2.xz=(t1.shops_rating * 100500 - t1.products_price);
  13.  

или
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT p.*
  3. FROM products p
  4. WHERE p.products_id =
  5. (SELECT p1.products_id FROM products p1 WHERE p.repairs_id=p1.repairs_id ORDER BY p1.shops_rating DESC, p1.products_price LIMIT 1)
  6.  


Надеюсь кому не будь пригодится, на будущие)

 

Powered by ExBB FM 1.0 RC1