
MySQL + группы товаров
#1
Опубликовано 12 June 2009 - 11:57
У товаров может быть несколько групп.
Группы записываються в одном столбце в формате "group1,group2,groupN".
Надо выводить спсиок товаров с фильтрацией по группам.
Фильтр опять же может содержать несколько групп и передаеться скрипту POSTом формы.
Какой запрос должен быть к мускулу что бы выбрать нужный товар ?
После долгих мучений пришел к выводу что надо юзать REGEXP в SELECTe, но правильный составить так и не получилось т.к. не осбо с ними дружу.
Помогайте =)))
#2
Опубликовано 12 June 2009 - 12:04
SELECT bla,bla1 FROM table WHERE group = 'post';
А можно ещё так: SELECT bla,bla1 FROM table WHERE group LIKE '%post%';
Хотя данные у тебя не в кошерном виде.
#3
Опубликовано 12 June 2009 - 12:18
Хуита же банальная, если список групп из формы в скрипт будет идти вида group1,group2...:
SELECT bla,bla1 FROM table WHERE group = 'post';
А можно ещё так: SELECT bla,bla1 FROM table WHERE group LIKE '%post%';
Хотя данные у тебя не в кошерном виде.
Да нет же.
Предположим от POSTa пришел массив : Array([0] => 1, [1] => 2, [2] => 3)
В базе есть товар который например входт в группы 1 и 3 т.е. запись вида "1,3"
Как его выбрать ?
#4
Опубликовано 12 June 2009 - 12:20
SELECT DISTINCT Т.Ид, Т.Имя FROM Товары Т, Группы Г WHERE Г.Ид IN Т.Группы AND Г.Ид IN (1,2,10);
хотя хз. я тут Ораклы в универе изучал - ХЗ чем оно обошлось. Да и табличка соответствий групп товарам была б покошерней
А также запись 1,2,3 1,3,4 и т.д. (=В базе есть товар который например входт в группы 1 и 3 т.е. запись вида "1,3"
Как его выбрать ?
#5
Опубликовано 12 June 2009 - 12:29
А также запись 1,2,3 1,3,4 и т.д. (=
Именно поэтому обычный селект или лайк не подходят (
Хотя данные у тебя не в кошерном виде.
предложи кошерный вид.
Если делать таблицу соответствий - id товара => id группы таблица же пзц здоровая получиться.
#6
Опубликовано 12 June 2009 - 12:48
ненависть.получиться
вместо тихого удаления постов, лучше бы исправил

#7
Опубликовано 12 June 2009 - 12:55
$new = implode(",", $array);
Отсюда:
mysql_query('SELECT bla,bla1 FROM table WHERE group = \''.$new.'\';');
Не?
Это что?SELECT DISTINCT Т.Ид, Т.Имя FROM Товары Т, Группы Г WHERE Г.Ид IN Т.Группы AND Г.Ид IN (1,2,10);
И IN (1,2,10); = Г.Ид = 1 OR Г.Ид = 2 OR Г.Ид = 10.
#8
Опубликовано 12 June 2009 - 13:05
нужно было сделать отдельную таблицу "goods_groups_link" и в ней столбцы
'id' 'id_goods' 'id_group'
и херачить туда записи описывающие соответствие товара группам
и выборка соотвественно 'select distinct id_goods from goods_groups_link where id_groups='1' or id_groups='3' or id_groups='n';" - получаем массив id товаров.
а в твоем случае можно попробовать так
типа "select distinct id from goods where group like '%group1%' or group like '%group3%' or group like '%groupN%'";
#9
Опубликовано 12 June 2009 - 13:35
Выбрать товар, принадлежащий группе 1 и 3 ?
SELECT * FROM goods WHERE grp LIKE '%,1,%' AND grp LIKE '%,3,%';
Только такая хрень будет работать только если записывать группы в виде ",1,2,3,4," (т.е. с запятой в начале и в конце).
Или же в селекте можно поменять grp на CONCAT(CONCAT(',' grp), ',')
#10
Опубликовано 12 June 2009 - 13:42
Гекс, ты теперь понимаешь, что я имел в виду, когда говорил, что непродуманная архитектура ведёт к бесконечным костылям и затруднению поддержки и расширения в будущем?

сколько раз я говорил, что метод "наваять как можно быстрее" - ущербен в корне?

а ты не верил.
#11
Опубликовано 12 June 2009 - 13:44
Не всегда надо делать по книжке.
#12
Опубликовано 12 June 2009 - 13:49
это убивает саму идею реляционных баз данныхДа нормально! Иногда оптимальнее сделать неправильно с группами в стообике через запятую, чем ваять отдельную таблицу.
#13
Опубликовано 12 June 2009 - 13:50
да, наверное, но ведь ты не будешь отрицать, что все вышепредложенные методы решения есть ни что иное, как костыли. и через пол года, если придётся расширить это всё как-нибудь - будет очень весело.Да нормально! Иногда оптимальнее сделать неправильно с группами в стообике через запятую, чем ваять отдельную таблицу.

не только. я просто более обобщённо говорилэто убивает саму идею реляционных баз данных

а так да, согласен.
#14
Опубликовано 12 June 2009 - 14:10
Не спорю.это убивает саму идею реляционных баз данных
Но иногда реально прикидываешь гемор и нагрузку на сервер, которая получится если сделать все как надо - и выбираешь кривой, нереляционный путь, но, сцуко, - оптимальный по скорости работы

Ну, это смотря что делать... иногда и через 10 лет оно не потребует расширения и переделкида, наверное, но ведь ты не будешь отрицать, что все вышепредложенные методы решения есть ни что иное, как костыли. и через пол года, если придётся расширить это всё как-нибудь - будет очень весело.

Тут все зависит от конкретной ситуёвины
#16
Опубликовано 12 June 2009 - 15:24
#17
Опубликовано 12 June 2009 - 15:28
ну а как решена-то мля?
Вот так :
SELECT * FROM goods WHERE grp LIKE '%,1,%' AND grp LIKE '%,3,%';
Только такая хрень будет работать только если записывать группы в виде ",1,2,3,4," (т.е. с запятой в начале и в конце).
А точнее (специально для тебя что бы не задавал лишних вопросов и у тебя появилась еще одна возможность обосрать мой было код) вот так :
$q = "SELECT * FROM item_main"; if(!empty($_REQUEST['sfg']) && !is_array($_REQUEST['sfg'])) { $q .= " WHERE cat='".$_REQUEST['sfg']."'"; } if(is_array($_REQUEST['sfg']) && count($_REQUEST['sfg']>0)){ $q .= " WHERE "; for($i=0;$i<count($_REQUEST['sfg']);$i++){ $q .= "cat LIKE '%,".$_REQUEST['sfg'][$i].",%'"; $q .= ($i<count($_REQUEST['sfg'])-1) ? " OR " : " "; } } $sql = dosql($q);
#18
Опубликовано 12 June 2009 - 15:30
#19
Опубликовано 12 June 2009 - 15:38
хм
а empty() с массивами не работает? если бы работало, можно было бы куда кошернее сделать:
$elt = $_REQUEST['sfg']; if (!empty($elt)) { if (is_array($elt)) { foo1() } else { foo2() } }

#20
Опубликовано 12 June 2009 - 15:40
LIKE безусловно самая быстрая операция сравнения в MySQL :-)
2279 записи выводяться за 1.777055 секунд

GeX
хм
а empty() с массивами не работает? если бы работало, можно было бы куда кошернее сделать:if (!empty(...)) { if (is_array(...)) { foo1() } else { foo2() } }
Там может быть и не массив =)
Посетителей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных пользователей