Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Здравствуйте, помогите пожалуйста,
у меня есть две таблицы - товары и категории,
у товаров столбцы: id, id категории, имя товара, цена
у категорий: id, имя категории, описание
мне нужно
1. Выбрать и вывести только те категории, где, помимо прочих товаров присуствуют еще И товар1 И товар2 одновременно
т.е результат
/*это то что надо*/
Категория 1(инфа из всех столбцов таблицы категория): товар1(инфа из всех столбцов таблицы товар по данному товару), товар2, товар3, ...
Категория 2: товар5, товар1, товар7, товар2, товар3, ...
/*это то что НЕ надо*/
Категория 3: товар1, товар3, товар4... - т.е нет товара2
Категория 4: товар2, товар4... - т.е нет товара1
2. И вторая задача - вывести категории где встречаются только эти два товара и только вместе
т.е результат
/*это то что надо*/
Категория 1: товар1, товар2
Категория 2: товар1, товар2
/*это то что НЕ надо*/
Категория 3: товар1, товар3, товар2
Категория 3: товар1, товар4
И это надо сделать с группировкой по айди категории и выводом всей информации по категориям и товарам с таблиц
я пыталась сделать так
$wer2 = mysql_query("SELECT c.*, GROUP_CONCAT(t.product_id, ' - ', t.price, ' , ', k.product_id, ' - ', k.price ORDER BY t.product_id ASC SEPARATOR '<br />') AS prod_id FROM categories c JOIN products t ON t.category_id=c.id AND t.product_id=1 JOIN products k ON k.category_id=c.id AND k.product_id=5 WHERE c.name = 2 GROUP BY c.id", $link);
это вывело только те категории где есть и товар1 и товар2 и больше никого, но при этом в категории где присуствуют несколько товаров с этими именами информация о товарах както искажается, т.е инфа с первого товара переходит на другой
Должно быть примерно както так
Таблица товаров
id | category_id | product_id | price
----|--------------|------------|------
1 | 3 | 1 | 2.09
2 | 3 | 2 | 3.78
3 | 5 | 3 | 4.67
4 | 6 | 2 | 3.78
5 | 2 | 2 | 3.78
6 | 1 | 3 | 4.67
7 | 2 | 1 | 2.09
8 | 3 | 5 | 6.06
9 | 3 | 5 | 6.06
Таблица категории
id | category_nam |c_decription|
----|-----------------|--------------|
1 | a1 | a |
2 | a2 | b |
3 | a3 | c |
4 | q3 | d |
5 | q3 | bq |
6 | q7 | cq |
7 | e6 | dq |
Результат 1
Выбрать и вывести только те категории, где, помимо прочих товаров присуствуют еще И товар1 И товар2 одновременно
id_cat| category_nam|c_decription| info_product
-------|-----------------|-------------|--------------------------------
3 | a3 | c | product_id - 1, price - 2.09
| | | product_id - 2, price - 3.78
| | | product_id - 5, price - 6.06
------------------------------------------------------------------
2 | a2 | a | product_id - 2, price - 3.78
| | | product_id - 1, price - 2.09
------------------------------------------------------------------
Результат 2
вывести категории где встречаются только эти два товара и только вместе
id_cat| category_nam|c_decription| info_product
-------|-----------------|-------------|--------------------------------
2 | a2 | c | product_id - 2, price - 3.78
| | | product_id - 1, price - 2.09
------------------------------------------------------------------
Отредактированно Юля19901 (11.09.2015 10:25:15)
Неактивен
Приведите пожалуйста тестовое наполнение таблиц (немного данных, чтобы отразили проблему) и выборку, которую хотите получить.
Неактивен
Я отредактировала свое первое сообщение, извиняюсь что таблички кривовато получились
Неактивен
1.
Неактивен
'in (1,2)' - это выражение ведь дает либо 1, либо 2, но не одновременно 1 и 2. Мне нужно в первом случае вывести категории где помимо прочих товаров присутствуют и 1 и 2 одновременно, а во втором случае, вывести категории где присуствуют только 1 и 2 сразу.
Отредактированно Юля19901 (11.09.2015 12:25:58)
Неактивен
Попробуем с явками и паролями...
Стартовый капитал:
+--------+--------------+---------------+-----------------------------------------------------------------------------------------+ | id_cat | category_num | c_description | group_concat(distinct concat(tovar.product_id, ' -- ', tovar.price) SEPARATOR '<br />') | +--------+--------------+---------------+-----------------------------------------------------------------------------------------+ | 3 | a3 | c | 5 -- 6.06<br />1 -- 2.09<br />2 -- 3.78 | +--------+--------------+---------------+-----------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
Возникает вопрос - товары привязываются к категориям через product_id или через id?
mysql> select cat.*,group_concat(distinct concat(tovar.product_id, ' -- ', tovar.price) SEPARATOR '<br />') from t_7535_tovar as tovar JOIN t_7535_cat cat ON tovar.category_id = cat.id_cat GROUP BY cat.id_cat HAVING ( sum(case when tovar.product_id in (1,2) then 1 else 0 end) = 2 ); +--------+--------------+---------------+-----------------------------------------------------------------------------------------+ | id_cat | category_num | c_description | group_concat(distinct concat(tovar.product_id, ' -- ', tovar.price) SEPARATOR '<br />') | +--------+--------------+---------------+-----------------------------------------------------------------------------------------+ | 2 | a2 | b | 2 -- 3.78<br />1 -- 2.09 | | 3 | a3 | c | 5 -- 6.06<br />1 -- 2.09<br />2 -- 3.78 | +--------+--------------+---------------+-----------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)
Наверное вот это ближе к истине (то есть это те, в которых есть первый и второй товары, и может быть еще какие-то)?
mysql> select cat.*,group_concat(distinct concat(tovar.product_id, ' -- ', tovar.price) SEPARATOR '<br />') from t_7535_tovar as tovar JOIN t_7535_cat cat ON tovar.category_id = cat.id_cat GROUP BY cat.id_cat HAVING ( ( sum(case when tovar.product_id in (1,2) then 1 else 0 end) = 2 ) AND count(tovar.product_id) = 2 ); +--------+--------------+---------------+-----------------------------------------------------------------------------------------+ | id_cat | category_num | c_description | group_concat(distinct concat(tovar.product_id, ' -- ', tovar.price) SEPARATOR '<br />') | +--------+--------------+---------------+-----------------------------------------------------------------------------------------+ | 2 | a2 | b | 2 -- 3.78<br />1 -- 2.09 | +--------+--------------+---------------+-----------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
Ну а этот вариант - где есть только первый и второй товары.
Оно?
Неактивен
таблица товаров.category_id = таблица категорий.id
Неактивен
Я несколько про другое спрашивал - скорее про то, чем определяется "Товар 1" - полем id или product_id. Выше отредактировал сообщение с запросами, поизучайте.
Неактивен
товар 1 определяется полем product_id
"(то есть это те, в которых есть первый и второй товары, и может быть еще какие-то)" да, это подходит. Большое спасибо. Правда у меня почему то только одну строку выдает.
Неактивен
Если одну строку выдаёт, значит не подходит ;-). На моих данных две строки или одна?
Если у Вас свой набор - то в идеале разместите его на sqlfiddle, там можно будет быстро не отходя от кассы понять, в чем дело.
И второй запрос нормально работает на Ваших данных?
Неактивен
Да, всё нормально работает. С первой выборкой это у меня данные не совсем совпали, всё в порядке, спасибо.
Неактивен
Страниц: 1