[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: сложная выборка
Zzepish
Ребят, такая тема:
Есть новости:
id|category_id

и категории:

id|Name

category_id может иметь вид: 123,234,243

Т.е. новость под несколько категорий.

Так вот- нужно выбрать новости со схожими категориями. Как это запилить? IN() не прокатит, ибо SELECT игнорит запятые(реагирурует наних как на строку.). LIKE- не вариант. Ибо может быть не 2-х, а n-значное число
vagrand
Единственно правильный вариант это сделать связь с категориями через отдельную таблицу. То что есть у вас очень не верное решение, в чем вы сами уже сейчас и убедились.

_____________
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
vagrand
Решение не мое. Пилил бы я по другому
andrey888
Связи действительно делать нужно через отдельную таблицу. Это прально. Но если пользуешься готовим движком и там такая хрень - то это проблема..
вот вроде по твоей теме
http://www.sql.ru/forum/818611/dva-znacheniya-v-odnom-pole

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
vagrand
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
FIND_IN_SET() - может прокатит ..
http://dev.mysql.com/doc/refman/5.0/en/str...ion_find-in-set

_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
inpost
Zzepish
Говоришь так владельцу: надо переделывать, есть 2 варианта:
1) Дешевый, но слишком нагруженный для сервера, посмотри примеры выше или рег.эксп с выборкой сделай. В случае, если много народу прибежит, то сайт будет плохо работать, может даже падать. Это доработки существующего скрипта
2) Переписать и написать новый скрипт - дорогой, но оптимизированный.

Причина перехода: нарушена, если не ошибаюсь в порядке, то вторая нормальная форма. В данном случае нарушение пошло во вред сайту.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
mmsgold
есть еще вариант я думаю, выбрать это поле из базы, создать из него массив а потом из массива сделать динамический запрос с помощью функции
$str = "WHERE";
//если массив пуст то, можно так $str = "WHERE 1"
// а если нет то через форейч привести массив к такому виду id = array[]
// тоесть в массиве будет так [0]=>"id = 123", [1]=>"id = 232" и т.д.
$str .= implode(" AND ",array);
$query = "SELECT * FROM data $str"

ps если есть какие замечания или плиз отпишитесь
killer8080
Цитата (inpost @ 11.08.2013 - 22:24)
если не ошибаюсь в порядке, то вторая нормальная форма.

атомарность данных ячеек таблицы это 1nf.
Тут только одно решение - менять архитектуру, пытаться продолжать поддерживать ущербную, приведет только к возникновению новых проблем. Этот вариант даже рассматривать нельзя.



Спустя 1 минута, 37 секунд killer8080 написал(а):
Zzepish
почитай о нормализации баз данных
http://i-novice.net/6-normalnyx-form-bd/
Zzepish
vagrand
Я думал. Все, что придумал- костыли (да еще и систему грузят).
andrey888
Спс. Гляну
inpost
Скажу честно- скрипт писал не очень умный человек. Переделывать- лень. Да и дела у меня (движок пишу).
Придется пилить костыль.
mmsgold
Не вариант
Zzepish
killer8080
Я умею делать нормальную архитектуру базы! Не я эту делал
Guest
IN это сгруппированное WHERE для множества fields=value {OR}.
Возможно в цикле формировать
WHERE category_id=? OR category_id=? ...
?
Zzepish
Guest
Отпадает. Думал об этом. Придется юзать Like
inpost
Zzepish
ID 111
совпадать будет с 2111, 1115 и т.д. и т.п.
Только если грубо: ,111, то есть разделители обязательно с двух сторон, но тогда надо все записи менять и менять алгоритм добавления.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Zzepish
inpost
Именно по этой причине и отказался
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.