SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.09.2015 08:36:17

Юля19901
Участник
Зарегистрирован: 11.09.2015
Сообщений: 6

Помогите. Выборка категорий где есть и товар1 и товар2 помимо других

Здравствуйте, помогите пожалуйста,
у меня есть две таблицы - товары и категории,
у товаров столбцы: 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)

Неактивен

 

#2 11.09.2015 09:32:25

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Помогите. Выборка категорий где есть и товар1 и товар2 помимо других

Приведите пожалуйста тестовое наполнение таблиц (немного данных, чтобы отразили проблему) и выборку, которую хотите получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 11.09.2015 10:35:04

Юля19901
Участник
Зарегистрирован: 11.09.2015
Сообщений: 6

Re: Помогите. Выборка категорий где есть и товар1 и товар2 помимо других

Я отредактировала свое первое сообщение, извиняюсь что таблички кривовато получились

Неактивен

 

#4 11.09.2015 12:13:02

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Помогите. Выборка категорий где есть и товар1 и товар2 помимо других

1.

select category_id from `Таблица товаров` where product_id in (1,2) group by 1 having count(distinct product_id)>1; -- категории, где, помимо прочих товаров присутствуют еще И товар1 И товар2 одновременно


2.

select category_id from `Таблица товаров` where product_id in (1,2) group by 1 having count(distinct product_id)=2; -- категории где встречаются только эти два товара и только вместе


Информацию по товарам можно получить или отдельным запросом, зная категории, или усложняя существующий. Например:

select c.*, product_id, price from `Таблица товаров` join `Таблица категории` c on category_id=c.id
where category_id in
(select category_id from `Таблица товаров` where product_id in (1,2) group by 1 having count(distinct product_id)>1);


или совсем как у вас

select c.*, group_concat(concat(product_id, ' -- ', price) SEPARATOR '<br />')  `info_product` from `Таблица товаров` join `Таблица категории` c on category_id=c.id
where category_id in
(select category_id from `Таблица товаров` where product_id in (1,2) group by 1 having count(distinct product_id)>1)
group by c.id;

Неактивен

 

#5 11.09.2015 12:22:23

Юля19901
Участник
Зарегистрирован: 11.09.2015
Сообщений: 6

Re: Помогите. Выборка категорий где есть и товар1 и товар2 помимо других

'in (1,2)' - это выражение ведь дает либо 1, либо 2, но не одновременно 1 и 2. Мне нужно в первом случае вывести категории где помимо прочих товаров присутствуют и 1 и 2 одновременно, а во втором случае, вывести категории где присуствуют только 1 и 2 сразу.

Отредактированно Юля19901 (11.09.2015 12:25:58)

Неактивен

 

#6 11.09.2015 12:26:58

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Помогите. Выборка категорий где есть и товар1 и товар2 помимо других

Попробуем с явками и паролями...

Стартовый капитал:

drop table if exists t_7535_tovar;
create table t_7535_tovar(id int,category_id int, product_id int, price float);
insert into t_7535_tovar values(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);
drop table if exists t_7535_cat;
create table t_7535_cat(id_cat int,category_num varchar(255),c_description varchar(255));
insert into t_7535_cat values(1,'a1','a'),(2,'a2','b'),(3,'a3','c'),(4,'q3','d'),(5,'q3','bq'),(6,'q7','cq'),(7,'e6','dq');
 


Запрос

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.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 />') |
+--------+--------------+---------------+-----------------------------------------------------------------------------------------+
|      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)

Ну а этот вариант - где есть только первый и второй товары.

Оно?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 11.09.2015 12:36:45

Юля19901
Участник
Зарегистрирован: 11.09.2015
Сообщений: 6

Re: Помогите. Выборка категорий где есть и товар1 и товар2 помимо других

таблица товаров.category_id  = таблица категорий.id

Неактивен

 

#8 11.09.2015 12:41:04

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Помогите. Выборка категорий где есть и товар1 и товар2 помимо других

Я несколько про другое спрашивал  - скорее про то, чем определяется "Товар 1" - полем id или product_id. Выше отредактировал сообщение с запросами, поизучайте.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 11.09.2015 13:52:35

Юля19901
Участник
Зарегистрирован: 11.09.2015
Сообщений: 6

Re: Помогите. Выборка категорий где есть и товар1 и товар2 помимо других

товар 1 определяется полем product_id
"(то есть это те, в которых есть первый и второй товары, и может быть еще какие-то)" да, это подходит. Большое спасибо. Правда у меня почему то только одну строку выдает.

Неактивен

 

#10 11.09.2015 14:24:37

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Помогите. Выборка категорий где есть и товар1 и товар2 помимо других

Если одну строку выдаёт, значит не подходит ;-). На моих данных две строки или одна?
Если у Вас свой набор - то в идеале разместите его на sqlfiddle, там можно будет быстро не отходя от кассы понять, в чем дело.

И второй запрос нормально работает на Ваших данных?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 11.09.2015 14:32:18

Юля19901
Участник
Зарегистрирован: 11.09.2015
Сообщений: 6

Re: Помогите. Выборка категорий где есть и товар1 и товар2 помимо других

Да, всё нормально работает. С первой выборкой это у меня данные не совсем совпали, всё в порядке, спасибо.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson