Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

MySQL. Поиск. Зависимости. Хэлп.

369
01 ноября 2010 года
Kesano
451 / / 09.10.2007
Приветствую вас.
Нужен такой хэлп.
Существуют две таблицы:

Каталоги:
cid, pid, name - где первое поле понятно, второе - родительская категория, 3 - имя.

Итемы:
id, cid, name, description - тут тоже всё понятно.

Вопрос: как правильней сделать возможность вхождения одного итема в несколько категорий? Каким-то образом пихать список cid в одно поле? (И как потом осуществлять поиск?).
Или же создавать таблицу зависимостей отдельно, где указывать попарно id и cid, например так:
id - cid
23 - 4
23 - 5
23 - 20

где 23 - айди итема, 4,5,20 - айди каталогов, в которые входит товар.

Заранее спасибо.

---
Ну и дополнительно, если таблицу зависимостей - как лучше (правильней) составить запрос на извлечение всех найденых итемов, чтобы не бомбить мускуль запросами?
396
01 ноября 2010 года
SibBear
223 / / 27.07.2006
я за 2й вариант. JOIN две таблицы и никаких проблем с "(И как потом осуществлять поиск?)"

SELECT * FROM cat_table as ct LEFT JOIN parent_table as pt ON pt.pid=ct.id WHERE pt.pid=23

получим сам итем и список категорий в которых находится итем.

ну или наоборот сформировать запрос, выбрать из категорий список итемов где категория=5 и сами итемы. в любом случае JOIN решит все одним запросом
244
01 ноября 2010 года
UAS
2.0K / / 19.07.2006
Смотрите соседнюю тему, сообщение от SidBear.
Да, правильно делать отдельную таблицу (cid в items не указывать).
Да, выборка делается через обычный JOIN.
SELECT i.* FROM items i
INNER JOIN items_cats c ON c.cid = 20 AND i.id = c.id
369
01 ноября 2010 года
Kesano
451 / / 09.10.2007
Спасибо. Значит направление мысли у меня правильное.
Эх, пойду курить мануал по Мускулю на тему JOIN. Просто раньше сталкиваться не приходилось.
1.9K
01 ноября 2010 года
Werky
129 / / 14.01.2006
Второй вариант не то что бы лучше, он правильнее, так как есть такое понятие как нормальзация БД. В котором сказано что значения в таблице должны быть атомарным.
396
01 ноября 2010 года
SibBear
223 / / 27.07.2006
http://www.anton-pribora.ru/articles/mysql/mysql-join
посмотри, довольно простая статья
369
01 ноября 2010 года
Kesano
451 / / 09.10.2007
Спс медвежонко. Пошел курить.
396
01 ноября 2010 года
SibBear
223 / / 27.07.2006
Цитата: Werky
Второй вариант не то что бы лучше, он правильнее, так как есть такое понятие как нормальзация БД. В котором сказано что значения в таблице должны быть атомарным.



ну по большому счету если уж совсем 3НФ делать, то и description нужно выносить, но в небольшом проекте наверное это лишнее...

369
01 ноября 2010 года
Kesano
451 / / 09.10.2007
в описании итемов планируется от 1000 до 10000 записей.
13
01 ноября 2010 года
RussianSpy
3.0K / / 04.07.2006
Цитата: Kesano
в описании итемов планируется от 1000 до 10000 записей.



Это совсем мало. 10к записей даже для мускуля это не объем.

369
01 ноября 2010 года
Kesano
451 / / 09.10.2007
Учесть надо что это будет на виртуалхосе, а не на отдельном тазике... Тут каждая милисекунда процессорного времени дорога.
369
01 ноября 2010 года
Kesano
451 / / 09.10.2007
Что-то прочитал. И не допёр. В каком виде будуот отдаваться данные. Про сопоставления строк я понял. но там же к 1 итему будет отдаваться несколько категорий. А требуется уникальность ключа.

Не могли бы вы предоставить конкретный запрос к мускулю, который я бы потому там вывел на страницу и посмотрел как что отдаётся...

таблица category:
cid, pid, name

таблица product:
id, name

таблица соответствий inside:
id, cid

содержание inside:
1, 3
1, 5
1, 6
2, 1
2, 3
2, 6

Хэлп с запросом.
10
01 ноября 2010 года
Freeman
3.2K / / 06.03.2004
В where достаточно написать, что чему равно. Точно таким образом, как нам объясняешь. Если в where с двух сторон равенства стоят поля таблиц, в SQL это автоматически трактуется как join (inner join).

Из твоего объяснения мало что понял. :(
396
01 ноября 2010 года
SibBear
223 / / 27.07.2006
таблица category:
cid, name

таблица product:
id, name

таблица соответствий inside:
id, cid

содержание inside:
1, 1 - 1й продукт в 1й категории
1, 2 - 1й продукт во 2й категории
2, 1 - 2й продукт в 1й категории
...


выполни в phpMyAdmin запрос
Код:
CREATE TABLE `category` (
  `cid` int(11) NOT NULL,
  `name` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `category` VALUES(1, 'category 1');
INSERT INTO `category` VALUES(2, 'category 2');

CREATE TABLE `parent` (
  `id` int(11) NOT NULL,
  `cid` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `parent` VALUES(1, 1);
INSERT INTO `parent` VALUES(1, 2);
INSERT INTO `parent` VALUES(2, 1);
INSERT INTO `parent` VALUES(3, 1);

CREATE TABLE `product` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `product` VALUES(1, 'prod 1');
INSERT INTO `product` VALUES(2, 'prod 2');
INSERT INTO `product` VALUES(3, 'prod 3');
INSERT INTO `product` VALUES(4, 'prod 4');


после этого посмотри варианты
 
Код:
SELECT * FROM `product` as p JOIN `category` as c JOIN `parent` as pt ON p.id=pt.id AND c.cid=pt.cid WHERE p.id=1

выберет таблицу для продукта 1

id name cid name id cid
1 prod 1 1 category 1 1 1
1 prod 1 2 category 2 1 2

 
Код:
SELECT * FROM `product` as p JOIN `category` as c JOIN `parent` as pt ON p.id=pt.id AND c.cid=pt.cid WHERE p.id=2

выберет таблицу для продукта 2

id name cid name id cid
2 prod 2 1 category 1 2 1

и т.п.

вобщем открывай phpMyAdmin и пробуй разные варианты JOIN своих таблиц, много интересного поймешь...
369
01 ноября 2010 года
Kesano
451 / / 09.10.2007
Ща буду пробовать. Спс.

Очень наглядно. Буду пробовать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог