Перейти к содержимому


Фотография
- - - - -

MySQL + группы товаров


  • Пожалуйста, авторизуйтесь, чтобы ответить
37 ответов в этой теме

#1 GeX

GeX

    Super True Member

  • Moderators
  • PipPipPipPipPip
  • 11 350 сообщений
111
Очень хороший
  • Пол:Мужчина
  • Город:Ленинский 110/2

Опубликовано 12 Июнь 2009 - 11:57

Имееться табличка с товарами.
У товаров может быть несколько групп.
Группы записываються в одном столбце в формате "group1,group2,groupN".
Надо выводить спсиок товаров с фильтрацией по группам.
Фильтр опять же может содержать несколько групп и передаеться скрипту POSTом формы.
Какой запрос должен быть к мускулу что бы выбрать нужный товар ?
После долгих мучений пришел к выводу что надо юзать REGEXP в SELECTe, но правильный составить так и не получилось т.к. не осбо с ними дружу.
Помогайте =)))
  • 0
Я в контакте Ты должен быть сильным, иначе, зачем тебе быть
Размещенное изображениеРазмещенное изображение
Размещенное изображениеРазмещенное изображение

#2 лайт

лайт

    iddqd

  • True Members
  • PipPipPipPipPip
  • 3 843 сообщений
9
Обычный
  • Пол:Мужчина

Опубликовано 12 Июнь 2009 - 12:04

Хуита же банальная, если список групп из формы в скрипт будет идти вида group1,group2...:
SELECT bla,bla1 FROM table WHERE group = 'post';
А можно ещё так: SELECT bla,bla1 FROM table WHERE group LIKE '%post%';
Хотя данные у тебя не в кошерном виде.
  • 0

#3 GeX

GeX

    Super True Member

  • Moderators
  • PipPipPipPipPip
  • 11 350 сообщений
111
Очень хороший
  • Пол:Мужчина
  • Город:Ленинский 110/2

Опубликовано 12 Июнь 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"
Как его выбрать ?
  • 0
Я в контакте Ты должен быть сильным, иначе, зачем тебе быть
Размещенное изображениеРазмещенное изображение
Размещенное изображениеРазмещенное изображение

#4 Мяут

Мяут

    Mr. Goodcat

  • True Members
  • PipPipPipPipPip
  • 4 156 сообщений
67
Хороший
  • Пол:Мужчина
  • Город:Пушкин

Опубликовано 12 Июнь 2009 - 12:20

mySQL знал давно, но может помощь что-нить вроде (если конечно группа idшников суть запись о группах)

SELECT DISTINCT Т.Ид, Т.Имя FROM Товары Т, Группы Г WHERE Г.Ид IN Т.Группы AND Г.Ид IN (1,2,10);

хотя хз. я тут Ораклы в универе изучал - ХЗ чем оно обошлось. Да и табличка соответствий групп товарам была б покошерней

В базе есть товар который например входт в группы 1 и 3 т.е. запись вида "1,3"
Как его выбрать ?

А также запись 1,2,3 1,3,4 и т.д. (=
  • 0

#5 GeX

GeX

    Super True Member

  • Moderators
  • PipPipPipPipPip
  • 11 350 сообщений
111
Очень хороший
  • Пол:Мужчина
  • Город:Ленинский 110/2

Опубликовано 12 Июнь 2009 - 12:29

А также запись 1,2,3 1,3,4 и т.д. (=


Именно поэтому обычный селект или лайк не подходят (

Хотя данные у тебя не в кошерном виде.


предложи кошерный вид.
Если делать таблицу соответствий - id товара => id группы таблица же пзц здоровая получиться.
  • 0
Я в контакте Ты должен быть сильным, иначе, зачем тебе быть
Размещенное изображениеРазмещенное изображение
Размещенное изображениеРазмещенное изображение

#6 GlebVt

GlebVt

    нервное чучело

  • True Members
  • PipPipPipPipPip
  • 6 290 сообщений
69
Хороший
  • Пол:Мужчина

Опубликовано 12 Июнь 2009 - 12:48

получиться

ненависть.
вместо тихого удаления постов, лучше бы исправил :) трудно что ли?
  • 0

#7 лайт

лайт

    iddqd

  • True Members
  • PipPipPipPipPip
  • 3 843 сообщений
9
Обычный
  • Пол:Мужчина

Опубликовано 12 Июнь 2009 - 12:55

asort($array);
$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.
  • 0

#8 miver

miver

    красноглазег

  • Moderators
  • PipPipPipPipPip
  • 3 850 сообщений
73
Хороший
  • Пол:Мужчина
  • Город:Арбиталь
  • Интересы:Linux FreeBSD домашние сети

Опубликовано 12 Июнь 2009 - 13:05

"Группы записываються в одном столбце в формате "group1,group2,groupN" - в корне неверно


нужно было сделать отдельную таблицу "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%'";
  • 0

#9 *soulburner*

*soulburner*

    You have reached level cap

  • True Members
  • PipPipPipPipPip
  • 5 619 сообщений
225
Очень хороший
  • Пол:Мужчина

Опубликовано 12 Июнь 2009 - 13:35

Не совсем понимаю, в чем великая проблема....

Выбрать товар, принадлежащий группе 1 и 3 ?

SELECT * FROM goods WHERE grp LIKE '%,1,%' AND grp LIKE '%,3,%';

Только такая хрень будет работать только если записывать группы в виде ",1,2,3,4," (т.е. с запятой в начале и в конце).

Или же в селекте можно поменять grp на CONCAT(CONCAT(',' grp), ',')
  • 0

#10 GlebVt

GlebVt

    нервное чучело

  • True Members
  • PipPipPipPipPip
  • 6 290 сообщений
69
Хороший
  • Пол:Мужчина

Опубликовано 12 Июнь 2009 - 13:42

ололо
Гекс, ты теперь понимаешь, что я имел в виду, когда говорил, что непродуманная архитектура ведёт к бесконечным костылям и затруднению поддержки и расширения в будущем? :)
сколько раз я говорил, что метод "наваять как можно быстрее" - ущербен в корне? :)
а ты не верил.
  • 0

#11 *soulburner*

*soulburner*

    You have reached level cap

  • True Members
  • PipPipPipPipPip
  • 5 619 сообщений
225
Очень хороший
  • Пол:Мужчина

Опубликовано 12 Июнь 2009 - 13:44

Да нормально! Иногда оптимальнее сделать неправильно с группами в стообике через запятую, чем ваять отдельную таблицу.

Не всегда надо делать по книжке.
  • 0

#12 miver

miver

    красноглазег

  • Moderators
  • PipPipPipPipPip
  • 3 850 сообщений
73
Хороший
  • Пол:Мужчина
  • Город:Арбиталь
  • Интересы:Linux FreeBSD домашние сети

Опубликовано 12 Июнь 2009 - 13:49

Да нормально! Иногда оптимальнее сделать неправильно с группами в стообике через запятую, чем ваять отдельную таблицу.

это убивает саму идею реляционных баз данных
  • 0

#13 GlebVt

GlebVt

    нервное чучело

  • True Members
  • PipPipPipPipPip
  • 6 290 сообщений
69
Хороший
  • Пол:Мужчина

Опубликовано 12 Июнь 2009 - 13:50

Да нормально! Иногда оптимальнее сделать неправильно с группами в стообике через запятую, чем ваять отдельную таблицу.

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

это убивает саму идею реляционных баз данных

не только. я просто более обобщённо говорил :)
а так да, согласен.
  • 0

#14 *soulburner*

*soulburner*

    You have reached level cap

  • True Members
  • PipPipPipPipPip
  • 5 619 сообщений
225
Очень хороший
  • Пол:Мужчина

Опубликовано 12 Июнь 2009 - 14:10

это убивает саму идею реляционных баз данных

Не спорю.

Но иногда реально прикидываешь гемор и нагрузку на сервер, которая получится если сделать все как надо - и выбираешь кривой, нереляционный путь, но, сцуко, - оптимальный по скорости работы :)

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

Ну, это смотря что делать... иногда и через 10 лет оно не потребует расширения и переделки :)

Тут все зависит от конкретной ситуёвины
  • 0

#15 GeX

GeX

    Super True Member

  • Moderators
  • PipPipPipPipPip
  • 11 350 сообщений
111
Очень хороший
  • Пол:Мужчина
  • Город:Ленинский 110/2

Опубликовано 12 Июнь 2009 - 15:19

Проблема решена.
Всем спасибо.
Тему не закрываю :)
  • 0
Я в контакте Ты должен быть сильным, иначе, зачем тебе быть
Размещенное изображениеРазмещенное изображение
Размещенное изображениеРазмещенное изображение

#16 GlebVt

GlebVt

    нервное чучело

  • True Members
  • PipPipPipPipPip
  • 6 290 сообщений
69
Хороший
  • Пол:Мужчина

Опубликовано 12 Июнь 2009 - 15:24

ну а как решена-то мля?
  • 0

#17 GeX

GeX

    Super True Member

  • Moderators
  • PipPipPipPipPip
  • 11 350 сообщений
111
Очень хороший
  • Пол:Мужчина
  • Город:Ленинский 110/2

Опубликовано 12 Июнь 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);

  • 0
Я в контакте Ты должен быть сильным, иначе, зачем тебе быть
Размещенное изображениеРазмещенное изображение
Размещенное изображениеРазмещенное изображение

#18 Мяут

Мяут

    Mr. Goodcat

  • True Members
  • PipPipPipPipPip
  • 4 156 сообщений
67
Хороший
  • Пол:Мужчина
  • Город:Пушкин

Опубликовано 12 Июнь 2009 - 15:30

LIKE безусловно самая быстрая операция сравнения в MySQL :-)
  • 0

#19 GlebVt

GlebVt

    нервное чучело

  • True Members
  • PipPipPipPipPip
  • 6 290 сообщений
69
Хороший
  • Пол:Мужчина

Опубликовано 12 Июнь 2009 - 15:38

GeX
хм
а empty() с массивами не работает? если бы работало, можно было бы куда кошернее сделать:
$elt = $_REQUEST['sfg'];

if (!empty($elt)) {
	if (is_array($elt)) {
		foo1()
	} else {
		foo2()
	}
}

:)
  • 0

#20 GeX

GeX

    Super True Member

  • Moderators
  • PipPipPipPipPip
  • 11 350 сообщений
111
Очень хороший
  • Пол:Мужчина
  • Город:Ленинский 110/2

Опубликовано 12 Июнь 2009 - 15:40

LIKE безусловно самая быстрая операция сравнения в MySQL :-)


2279 записи выводяться за 1.777055 секунд :)

GeX
хм
а empty() с массивами не работает? если бы работало, можно было бы куда кошернее сделать:

if (!empty(...)) {
	if (is_array(...)) {
		foo1()
	} else {
		foo2()
	}
}

:)


Там может быть и не массив =)
  • 0
Я в контакте Ты должен быть сильным, иначе, зачем тебе быть
Размещенное изображениеРазмещенное изображение
Размещенное изображениеРазмещенное изображение


Посетителей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных пользователей