2015-03-27 3 views
0

:MySQL сравнить два первых слова produst и дать самой низкой цене базы данных

id name   price 

1 apple iphone 500 
2 apple iphone 300 
3 apple iphone 250 
4 apple iphone 400 
5 nokia xl  300 
6 nokia xl abc 200 
7 nokia xl  250 
  1. я хочу показать продукт с самой низкой ценой.
  2. Если продукт состоит из более чем двух слов, он должен группироваться по первым двум словам и давать продукт с самой низкой ценой.
  3. вывод должен показывать идентификатор, имя и цену.

мои запросы:

CREATE FUNCTION SPLIT_STR(
    x VARCHAR(255), 
    delim VARCHAR(12), 
    pos INT 
) 
RETURNS VARCHAR(255) 
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), 
     LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), 
     delim, ''); 

SELECT mt.*,TRIM(CONCAT(SPLIT_STR(`name`, " ",1)," ",SPLIT_STR(`name`, " ",2))) as shrt 
FROM items mt INNER JOIN 
    (
     SELECT ID, MIN(price) MinPrice,TRIM(CONCAT(SPLIT_STR(`name`, " ",1)," ",SPLIT_STR(`name`, " ",2))) as shrt 
     FROM items 
     GROUP BY shrt 
    ) t ON shrt = t.shrt AND mt.price = t.MinPrice 

выход:

id name   price shrt 
3 apple iphone 250  apple iphone 
6 nokia xl abc 200  nokia xl 
7 nokia xl  250  nokia xl 

выход Желание:

id name   price shrt 
3 apple iphone 250  apple iphone 
6 nokia xl abc 200  nokia xl 
+0

что является SHRT в нужной таблице ?? –

+0

не нужно отображать стрит. i olny хотят отображать идентификатор, имя и цену. –

+1

Возможно, вам следует пересмотреть структуру базы данных, создать таблицы типа «бренд», «модель» и т. Д. И добавить отношения между ними? Гораздо проще выполнять запросы, не требуя сложных. Разве это не базы данных? – candle

ответ

0

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

SELECT mt.* FROM items mt JOIN(SELECT ID, MIN(price) MinPrice,TRIM(CONCAT(SPLIT_STR(`name`, " ",1)," ",SPLIT_STR(`name`, " ",2))) as shrt FROM items GROUP BY shrt) t ON mt.price = t.MinPrice group by shrt; 

Добавлены дополнительные записи, чтобы пересечь проверить вывод: - Предметы: -

mysql> select * from items; 
+----+--------------------+-------+ 
| id | name    | price | 
+----+--------------------+-------+ 
| 1 | apple iphone  | 500 | 
| 2 | apple iphone  | 300 | 
| 3 | apple iphone  | 400 | 
| 4 | apple iphone  | 250 | 
| 5 | apple iphone  | 300 | 
| 6 | nokia x1   | 300 | 
| 7 | nokia x1 abc  | 200 | 
| 8 | nokia x1   | 250 | 
| 10 | motorolla Gx two | 500 | 
| 11 | motorolla Gx  | 500 | 
| 12 | motorolla Gx three | 150 | 
+----+--------------------+-------+ 
11 rows in set (0.00 sec) 

Выход: -

mysql> SELECT mt.* FROM items mt JOIN(SELECT ID, MIN(price) MinPrice,TRIM(CONCAT(SPLIT_STR(`name`, " ",1)," ",SPLIT_STR(`name`, " ",2))) as shrt FROM items GROUP BY shrt) t ON mt.price = t.MinPrice group by shrt; 
+----+--------------------+-------+ 
| id | name    | price | 
+----+--------------------+-------+ 
| 4 | apple iphone  | 250 | 
| 12 | motorolla Gx three | 150 | 
| 7 | nokia x1 abc  | 200 | 
+----+--------------------+-------+ 
3 rows in set (0.00 sec) 
Смежные вопросы