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');
MySQL. Поиск. Зависимости. Хэлп.
Нужен такой хэлп.
Существуют две таблицы:
Каталоги:
cid, pid, name - где первое поле понятно, второе - родительская категория, 3 - имя.
Итемы:
id, cid, name, description - тут тоже всё понятно.
Вопрос: как правильней сделать возможность вхождения одного итема в несколько категорий? Каким-то образом пихать список cid в одно поле? (И как потом осуществлять поиск?).
Или же создавать таблицу зависимостей отдельно, где указывать попарно id и cid, например так:
id - cid
23 - 4
23 - 5
23 - 20
где 23 - айди итема, 4,5,20 - айди каталогов, в которые входит товар.
Заранее спасибо.
---
Ну и дополнительно, если таблицу зависимостей - как лучше (правильней) составить запрос на извлечение всех найденых итемов, чтобы не бомбить мускуль запросами?
SELECT * FROM cat_table as ct LEFT JOIN parent_table as pt ON pt.pid=ct.id WHERE pt.pid=23
получим сам итем и список категорий в которых находится итем.
ну или наоборот сформировать запрос, выбрать из категорий список итемов где категория=5 и сами итемы. в любом случае JOIN решит все одним запросом
Да, правильно делать отдельную таблицу (cid в items не указывать).
Да, выборка делается через обычный JOIN.
SELECT i.* FROM items i
INNER JOIN items_cats c ON c.cid = 20 AND i.id = c.id
Эх, пойду курить мануал по Мускулю на тему JOIN. Просто раньше сталкиваться не приходилось.
Второй вариант не то что бы лучше, он правильнее, так как есть такое понятие как нормальзация БД. В котором сказано что значения в таблице должны быть атомарным.
http://www.anton-pribora.ru/articles/mysql/mysql-join
посмотри, довольно простая статья
посмотри, довольно простая статья
Спс медвежонко. Пошел курить.
Цитата: Werky
Второй вариант не то что бы лучше, он правильнее, так как есть такое понятие как нормальзация БД. В котором сказано что значения в таблице должны быть атомарным.
ну по большому счету если уж совсем 3НФ делать, то и description нужно выносить, но в небольшом проекте наверное это лишнее...
в описании итемов планируется от 1000 до 10000 записей.
Цитата: Kesano
в описании итемов планируется от 1000 до 10000 записей.
Это совсем мало. 10к записей даже для мускуля это не объем.
Учесть надо что это будет на виртуалхосе, а не на отдельном тазике... Тут каждая милисекунда процессорного времени дорога.
Не могли бы вы предоставить конкретный запрос к мускулю, который я бы потому там вывел на страницу и посмотрел как что отдаётся...
таблица category:
cid, pid, name
таблица product:
id, name
таблица соответствий inside:
id, cid
содержание inside:
1, 3
1, 5
1, 6
2, 1
2, 3
2, 6
Хэлп с запросом.
Из твоего объяснения мало что понял. :(
cid, name
таблица product:
id, name
таблица соответствий inside:
id, cid
содержание inside:
1, 1 - 1й продукт в 1й категории
1, 2 - 1й продукт во 2й категории
2, 1 - 2й продукт в 1й категории
...
выполни в phpMyAdmin запрос
Код:
после этого посмотри варианты
Код:
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 своих таблиц, много интересного поймешь...
Очень наглядно. Буду пробовать.