2010-04-08 4 views
0

У меня есть форма, которая имеет несколько вариантов выпадающего списка. пользователь может выбрать несколько вариантов в выборе. имя выбора: array[]; используя php Я вызываю implode(",",$array) в mysql db, он сохраняет это поле как текст в этом формате "places"= "new york, toronto, london", когда я хочу отображать эти поля, я взорву запятую.mysql select query problem

Я пытаюсь запустить отчет, чтобы отобразить места. вот мой выбор:

"select * from mytable where db.places .. userSelectedPlaces"

как я могу проверить Торонто в списках «мест» выбрано, что пользователь? примечание «места» в db может быть либо «toronto», либо может быть разделено запятыми списками таких мест, как «ny, toronto, london, paris и т. д.».

+0

Это может использовать некоторое форматирование кода ... http://stackoverflow.com/editing-help –

+0

Я согласен с Джастином Этье. Но если вам нужно, загляните в функцию LOCATE http://dev.mysql.com/doc/refman/4.1/en/string-functions.html#function_locate –

ответ

2

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

  • mytable_id - Для того, чтобы присоединиться к столу в запросе
  • place - EG: «Торонто»

Затем вы можете запустить простой запрос, чтобы выяснить, если Торонто был выбран:

SELECT * 
    FROM mytable m 
INNER JOIN SelectedPlaces sp ON sp.mytable_id = m.id 
WHERE sp.place = 'Toronto' 
0

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

Но если вы хотите сделать это таким образом, вы можете использовать функцию strcmp.

+0

Причина, по которой дизайн подобен этому, потому что человек был в нескольких местах, и мы не хотели хранить места в другом столе. Заметьте, я использую «места» вместо моей фактической цели. – NULL

+0

Я вижу, но эта таблица денормализована, это признак того, что у вас что-то не так с вашим видом. В соответствии с принципами проектирования баз данных вы должны ввести новую таблицу для хранения мест, посещенных каждым пользователем. См. Ответ Джастина Этье, он описал, как это должно выглядеть. – wlk

0

Если я правильно понял, то это должно работать:

WHERE DB.PLACES LIKE '%TORONTO%' 

но, как говорили другие пользователи, это нехорошо иметь денормализованные таблицы.

0

Чтобы получить ответ на свой вопрос, запрос должен выглядеть как этот

SELECT * 
    FROM mytable 
WHERE places LIKE('%toronto%') 

Но, имейте в виду, что, как() медленно.

Чтобы косвенно ответить на ваш вопрос, ваша схема базы данных ошибочна. Это неправильный способ сделать отношения M: N (многие-ко-многим).

Представьте себе вместо того, чтобы у вас была эта

mytable   place     mytable_place    
+------------+ +----------+----------+ +------------+----------+ 
| mytable_id | | place_id | name  | | mytable_id | place_id | 
+------------+ +----------+----------+ +------------+----------+ 
| 1   | | 1  | new york | | 1   | 1  | 
| 2   | | 2  | toronto | | 1   | 2  | 
| 3   | | 3  | london | | 1   | 3  | 
+------------+ +----------+----------+ | 2   | 2  | 
             | 3   | 1  | 
             | 3   | 3  | 
             +------------+----------+ 

Таблица mytable_places является то, что называется справочную таблицу (или, Xref/таблица перекрестных ссылок, или корреляционная таблица). Его единственная работа - следить за тем, какие записи mytable имеют записи place, и наоборот.

Из этого примера мы видим, что первый mytable запись имеет все 3 места, то второй имеет только Торонто, а третий имеет википедия и лондон.

Это открывает вам слишком разнообразные запросы, которые были бы сложными, дорогими или невозможными с вашим текущим дизайном.

Хотите знать, сколько mytable записей есть toronto? Нет проблем

SELECT COUNT(*) 
    FROM mytable_place x 
    LEFT JOIN place p 
    ON p.place_id = x.place_id 
WHERE p.name = 'toronto'; 

Как насчет количества mytable записей на месте, отсортированные?

SELECT p.name 
    , COUNT(*) as `count` 
    FROM mytable_place x 
    LEFT JOIN place p 
    ON p.place_id = x.place_id 
GROUP BY p.place_id 
ORDER BY `count` DESC, p.name ASC 

И они будут гораздо быстрее, чем любой запрос с использованием LIKE, так как они могут использовать индексы на столбцах, таких как place.name.