2013-11-26 3 views
1

У меня есть 2 колонки, какMysql фильтр запроса, где условие

name price 
a|b|c 100|200|150 
x|y|z 150|100|160 

Здесь я хочу, чтобы получить цену, где цена> 150. Я не знаю, как взорваться? Спасибо

+0

http://stackoverflow.com/questions/471914/can-you-split-explode-a-field-in-a-mysql-query http://stackoverflow.com/questions/5928599/equivalent- of-explode-to-work-with-strings-in-mysql –

+1

1. Нормализуйте свои данные – Strawberry

+0

Здравствуйте, Jaywalker anti-pattern! Вместо того, чтобы пытаться использовать значения, разделенные разделителями при создании запроса, вы должны разделить свои значения и сохранить их в связанной таблице - и это решит все проблемы раз и навсегда –

ответ

1

Вы не можете взорваться в MySQL. Я настоятельно рекомендую вам реструктурировать таблицу как реляционную (т. Е. Каждое имя и цена должны занимать одну строку).

Возможно, возможно сделать некоторый тип численного сравнения с помощью подстрок, но я думаю, было бы намного проще просто запросить всю таблицу и фильтровать результаты через php (предположим, вы используете php, так как вы сказали explode , который обычно называется split на других языках).

foreach ($rows as $row) { 
    $names = explode("|", $row["name"]); 
    foreach (explode("|", $row["price"] as $idx => $price) { 
     if ($price > 150) { 
      $all_names[] = $name[$idx]; 
     } 
    } 
} 

Это, конечно, предполагает, что индексы столбца имен/цен совпадают правильно. Это также дорого, поскольку он должен запрашивать всю таблицу и не использует никаких (MySQL) индексов.


Для нормализации данных, что вы могли бы сделать, это есть таблица Groups, которая имеет groupID. Затем у вас есть текущая таблица с кортежем GroupID, name, price. Ваши данные будут выглядеть следующим образом:

groupID name price 
1   a  100 
1   b  200 
1   c  150 
2   x  150 
2   y  100 
2   z  160 

Тогда вы можете просто проверить WHERE price > 150, который был бы очень быстро, если price были проиндексированы. Это также позволит вам выполнять поиск по группе - в некоторых случаях это может быть полезно и даже быстрее.

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

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