2013-03-22 4 views
-3

Написание электронной коммерции для местного бизнеса. Все это сортировалось и так, просто выработали перегибы.MySQL - Сортировать по нескольким ключевым словам

Теперь у них есть много продуктов, которые являются одинаковыми, но только отличаются по цвету. Поэтому мне нужна помощь в сортировке по указанному цвету. Они называются следующим.

[Производитель] - [Color] - [Серия]

Пример: Art Spectrum - примула желтый - Серия 1

мне нужно их отсортировать по Желтой но иногда они не имеют определенного типа цвета. Как только Желтый, вместо Primrose Yellow. Кроме того, в базе данных есть несколько цветов - красный, зеленый, синий и т. Д., И у всех есть варианты.

В любом случае, как бы я сортировал это?

Благодаря

+0

Вам нужно сортировать или фильтровать (выбрать) на основе цвета? – peterm

+0

Сортировка, извините, я изменил свое сообщение, чтобы быть более ясным. – Aaron

+0

Вы должны начать с нормализации базы данных. Разделить "[Производитель] - [Цвет] - [Серия]" на три отдельные таблицы. Затем вы можете попробовать сортировку. – aidan

ответ

0

Я думаю, вам нужно использовать Full TEXT индексный поиск здесь.

Но полнотекстовый поиск поддерживается только для таблиц MyISAM.

Добавить FULLTEXT индекс к вашему колонку, а затем использовать следующий запрос:

Запрос:

SELECT * FROM table_name 
WHERE MATCH (column_name) 
AGAINST ('Yellow' IN BOOLEAN MODE) 
+0

Это может сработать. Но как я могу сделать это со всеми основными цветами? – Aaron

1

Если я вас правильно понимаю, вы можете попробовать

SELECT * 
    FROM products 
ORDER BY TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(prod_name, '-', 2),'-', -1) 

Это очевидно, позволит вам сортировать только путем точного совпадения имен цветов

SQLFiddle

UPDATE Теперь вы можете легко создать таблицу соответствия цветов, как этот

CREATE TABLE colors 
    (`color` varchar(64), `color2` varchar(64)) 
; 

Заполните его с соответствующими цветами

|   COLOR | COLOR2 | 
---------------------------- 
| Primrose Yellow | Yellow | 

Вы можете сначала заполнить поле color эта таблица с помощью запроса, как этого

INSERT INTO colors (color) 
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(prod_name, '-', 2),'-', -1)) 
    FROM products 

Затем вы можете использовать этот запрос, чтобы сделать то, что вы хотите

SELECT p.* 
FROM products p LEFT JOIN 
    colors c ON TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(p.prod_name, '-', 2),'-', -1)) = c.color 
ORDER BY COALESCE(c.color2, TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(p.prod_name, '-', 2),'-', -1))) 

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

Выход

| ID |         PROD_NAME | 
-------------------------------------------------- 
| 2 |     Art 2 - Red - Series 1 | 
| 1 | Art Spectrum - Primrose Yellow - Series 1 | 
| 3 |   Art Spectrum2 - Yellow - Series 2 | 

SQLFiddle для этого

+0

Я просто дал это выстрел, это то, чего я хочу. http://i.imgur.com/OxwN9Kc.png – Aaron

+0

@Aaron См. обновленный ответ – peterm

+0

Мне нравится эта идея. Вместо того, чтобы делать подстроку, потому что некоторые элементы не используют этот точный формат, есть способ выполнить полнотекстовое соответствие. как ORDER BY (SELECT color12 FROM colors WHERE color1 LIKE product.name) – Aaron

Смежные вопросы