Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как осуществить выборку?
 
 автор: yura_040   (09.06.2009 в 17:12)   письмо автору
 
 

Допустим есть таблица objects
Состоит она из
id - первичный ключ,
name - название объекта
facilities - удобства в объекте

Все это храниться вот так:

Певая запись:
ID=1;
name=гостиница берег
facilities = 23, 32, 32,34

Вторая запись:
Те ID=2;
name=отель бриг
facilities = 2, 32, 23,43,42,53

Третья запись:
Те ID=3;
name= гостиница Полет
facilities = 3,23,1,32,42

Т.Е. facilities содержит числа разделенные запятой

Как осуществить выборку по facilities чтобы вывести все записи в которой есть эти числа
например: 32, 23, 42

Пробовал вот так:


SELECT * FROM objects WHERE MATCH(facilities) AGAINST ('32*' IN BOOLEAN MODE) AND 
MATCH(facilities) AGAINST ('23*' IN BOOLEAN MODE) AND MATCH(facilities) AGAINST ('42*' IN BOOLEAN MODE) ORDER BY name


Не хочет выводить

Т.е. необходимо выводить записи по заданным facilities
или это вообще невозможно сделать средствами Mysql ?

Может кто знает что сделать можно ?

  Ответить  
 
 автор: Trianon   (09.06.2009 в 17:20)   письмо автору
 
   для: yura_040   (09.06.2009 в 17:12)
 

вот про удобства в объекте очень точно подмечено.

  Ответить  
 
 автор: Valick   (09.06.2009 в 17:25)   письмо автору
 
   для: Trianon   (09.06.2009 в 17:20)
 

:)

  Ответить  
 
 автор: yura_040   (09.06.2009 в 17:27)   письмо автору
 
   для: Trianon   (09.06.2009 в 17:20)
 

)) да мне бы эти удобства вывести из таблицы ..вообще было бы классно ))

  Ответить  
 
 автор: Valick   (09.06.2009 в 17:29)   письмо автору
 
   для: yura_040   (09.06.2009 в 17:12)
 

Я бы базу по-другому сделал
1 таблица - объекты
2 таблица - удобства
3 таблица - 1объект - 1 удобство

  Ответить  
 
 автор: yura_040   (09.06.2009 в 17:37)   письмо автору
 
   для: Valick   (09.06.2009 в 17:29)
 

В данном случае есть таблицы
1 таблица - объекты
2 таблица - удобства
эти таблицы есть


но по 3 таблице - 1объект - 1 удобство

тогда таким способом если будет 100 объектов и присвоить по 5 удобств каждому это уже 500 записей...

  Ответить  
 
 автор: Valick   (09.06.2009 в 17:39)   письмо автору
 
   для: yura_040   (09.06.2009 в 17:37)
 

и что?) хоть 50 000...
как Вы думаете сколько записей содержит база этого форума?)

  Ответить  
 
 автор: yura_040   (09.06.2009 в 17:43)   письмо автору
 
   для: Valick   (09.06.2009 в 17:39)
 

меня этот способ интересует можно так сделать по строке ?

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

если не получиться выводить так, то придется Вашим способом делать создавать дополнительную таблицу

  Ответить  
 
 автор: Valick   (09.06.2009 в 17:48)   письмо автору
 
   для: yura_040   (09.06.2009 в 17:43)
 

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

  Ответить  
 
 автор: yura_040   (09.06.2009 в 23:37)   письмо автору
 
   для: Valick   (09.06.2009 в 17:48)
 

требования такие, чтобы найти все записи в которых будут facilities например: 43,32,3


т.е человек ставит галочки в форме и каждой галочке соответствует например: 32- горячая вода, 43-TV, 3-DVD т.е. необходимо осуществить выборку по числам 32, 43, 3 или другие числа т.е. их может быть произвольное количество + сюда может быть еще тип какой-нибудь добавлен


SELECT * FROM objects WHERE MATCH(facilities) AGAINST ('32*' IN BOOLEAN MODE) AND 
MATCH(facilities) AGAINST ('43*' IN BOOLEAN MODE) AND MATCH(facilities) AGAINST ('3*' IN BOOLEAN MODE) AND MATCH(type) AGAINST ('5*' IN BOOLEAN MODE)   ORDER BY name



fulltext в facilities и type стоит в таблице
такой запрос не хочет выводить ничего ((

  Ответить  
 
 автор: Valick   (10.06.2009 в 00:24)   письмо автору
 
   для: yura_040   (09.06.2009 в 23:37)
 

Это я уже понял. Я имел ввиду другие разнообразные запросы.
Я книгу по MySQL найти не могу, без неё я как без рук)))

  Ответить  
 
 автор: ronin80   (10.06.2009 в 08:28)   письмо автору
 
   для: yura_040   (09.06.2009 в 23:37)
 

да уж, я бы точно никогда так делать не стал, получается у вас в поле facilities в таблицу objects через запятую вставляются id выбраных удобств? а как же тогда выбирать наименования удобств? через конструкцию IN ? а если удобство понадобится удалить? что тогда чистить все значения столбца facilities где присутствует этот номер?

структура базы однозначно неверная, ноебходимо произвести нормализацию, как вам было предложено ранее, т.е. создать промежуточную таблицу и хранить в ней структуру Объект=>удобства со ссылками на первичные ключи справочников иначе это не последние трудности с которыми вы столкнётесь

  Ответить  
 
 автор: Valick   (10.06.2009 в 09:26)   письмо автору
 
   для: ronin80   (10.06.2009 в 08:28)
 

угу.. только что-то я предложить предложил, а выборку сделать не могу)
может сделать временную таблицу со столбцами выбираемых удобств? Опять как-то загонно....

  Ответить  
 
 автор: yura_040   (10.06.2009 в 13:38)   письмо автору
 
   для: ronin80   (10.06.2009 в 08:28)
 

Да, скорее всего так и придется делать, создавать промежуточную таблицу availiable_facilities и хранить по одному ключу id_object и id_facilities.

Если я не ошибаюсь запрос будет таким и проблем не должно будет возникнуть

SELECT objects.*, availiable_facilities.* 
FROM objects, availiable_facilities
WHERE objects.id=availiable_facilities.id_ojects
AND availiable_facilities.id_facilities='44' 
AND availiable_facilities.id_facilities='32'
AND availiable_facilities.id_facilities='20'


Спасибо всем за помощь ))

  Ответить  
 
 автор: Valick   (10.06.2009 в 13:55)   письмо автору
 
   для: yura_040   (10.06.2009 в 13:38)
 

не работает такой запрос

  Ответить  
 
 автор: 345345   (10.06.2009 в 14:03)
 
   для: yura_040   (10.06.2009 в 13:38)
 

yura_040, чтобы id_facilities был равен 44 И 32 И 20 одновременно?

  Ответить  
 
 автор: yura_040   (10.06.2009 в 14:16)   письмо автору
 
   для: 345345   (10.06.2009 в 14:03)
 

На названия таблиц не обращайте внимания это запрос реальный ))

Вот этот запрос работает))


SELECT apartments.*, apartments_available_facilities.* 
FROM apartments, apartments_available_facilities
WHERE apartments.id=apartments_available_facilities.id_apartments
AND apartments_available_facilities.id_facilities IN(9, 10, 23)




В том запросе ошибся, что-то не подумал ))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования