Zzepish
11.08.2013 - 22:54
Ребят, такая тема:
Есть новости:
id|category_id
и категории:
id|Name
category_id может иметь вид: 123,234,243
Т.е. новость под несколько категорий.
Так вот- нужно выбрать новости со схожими категориями. Как это запилить? IN() не прокатит, ибо SELECT игнорит запятые(реагирурует наних как на строку.). LIKE- не вариант. Ибо может быть не 2-х, а n-значное число
vagrand
11.08.2013 - 23:02
Единственно правильный вариант это сделать связь с категориями через отдельную таблицу. То что есть у вас очень не верное решение, в чем вы сами уже сейчас и убедились.
_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
Zzepish
11.08.2013 - 23:05
vagrand
Решение не мое. Пилил бы я по другому
andrey888
11.08.2013 - 23:09
Связи действительно делать нужно через отдельную таблицу. Это прально. Но если пользуешься готовим движком и там такая хрень - то это проблема..
вот вроде по твоей теме
http://www.sql.ru/forum/818611/dva-znacheniya-v-odnom-pole
_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
vagrand
11.08.2013 - 23:09
Zzepish
А чье оно не важно, надо менять то что есть на то что правильно. Я конечно не утверждаю, что никакого другого решения нет, возможно и есть способ как-то извратится, но я точно его рекомендовать не буду.
_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
andrey888
11.08.2013 - 23:11
FIND_IN_SET() - может прокатит ..
http://dev.mysql.com/doc/refman/5.0/en/str...ion_find-in-set
_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
inpost
11.08.2013 - 23:24
ZzepishГоворишь так владельцу: надо переделывать, есть 2 варианта:
1) Дешевый, но слишком нагруженный для сервера, посмотри примеры выше или рег.эксп с выборкой сделай. В случае, если много народу прибежит, то сайт будет плохо работать, может даже падать. Это доработки существующего скрипта
2) Переписать и написать новый скрипт - дорогой, но оптимизированный.
Причина перехода: нарушена, если не ошибаюсь в порядке, то вторая нормальная форма. В данном случае нарушение пошло во вред сайту.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
mmsgold
11.08.2013 - 23:42
есть еще вариант я думаю, выбрать это поле из базы, создать из него массив а потом из массива сделать динамический запрос с помощью функции
$str = "WHERE";
//если массив пуст то, можно так $str = "WHERE 1"
// а если нет то через форейч привести массив к такому виду id = array[]
// тоесть в массиве будет так [0]=>"id = 123", [1]=>"id = 232" и т.д.
$str .= implode(" AND ",array);
$query = "SELECT * FROM data $str"
ps если есть какие замечания или плиз отпишитесь
killer8080
12.08.2013 - 00:10
Цитата (inpost @ 11.08.2013 - 22:24) |
если не ошибаюсь в порядке, то вторая нормальная форма. |
атомарность
данных ячеек таблицы это 1nf.
Тут только одно решение - менять архитектуру, пытаться продолжать поддерживать ущербную, приведет только к возникновению новых проблем. Этот вариант даже рассматривать нельзя.
Спустя
1 минута, 37 секунд killer8080 написал(а):
Zzepishпочитай о нормализации баз
данныхhttp://i-novice.net/6-normalnyx-form-bd/
Zzepish
12.08.2013 - 00:42
vagrand
Я думал. Все, что придумал- костыли (да еще и систему грузят).
andrey888
Спс. Гляну
inpost
Скажу честно- скрипт писал не очень умный человек. Переделывать- лень. Да и дела у меня (движок пишу).
Придется пилить костыль.
mmsgold
Не вариант
Zzepish
12.08.2013 - 00:43
killer8080
Я умею делать нормальную архитектуру базы! Не я эту делал
IN это сгруппированное WHERE для множества fields=value {OR}.
Возможно в цикле формировать
WHERE category_id=? OR category_id=? ...
?
Zzepish
12.08.2013 - 02:26
Guest
Отпадает. Думал об этом. Придется юзать Like
inpost
12.08.2013 - 02:30
ZzepishID 111
совпадать будет с 2111, 1115 и т.д. и т.п.
Только если грубо: ,111, то есть разделители обязательно с двух сторон, но тогда надо все записи менять и менять алгоритм добавления.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Zzepish
12.08.2013 - 19:25
inpost
Именно по этой причине и отказался
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.