выберите атрибут mysql - PullRequest
1 голос
/ 17 мая 2010

У меня есть таблица mysql:

**product (id,name)**
1  Samsung
2  Toshiba
3  Sony

**attribute (id,name,parentid)**
1 Size 0
2 19" 1
3 17" 1
4 15" 1
5 Color 0
6 White 5
7 Black 5
8 Price 0
9 <$100 8
10 $100-$300 8
11 >$300 8

**attribute2product (id,productid,attributeid)**
1 1 2
2 1 6
3 2 2
4 2 7
5 3 3
6 3 7
7 1 9
8 2 9
9 3 10

И перечислил их как:

**Size**
-- 19" (2)
-- 17" (1)
-- 15" (0)

**Color**
-- White (1)
-- Black (2)

**Price**
-- <$100 (1)
-- $100-$300 (1)
-- >$300 (1)

Пожалуйста, помогите мне в запросе mysql перечислить имя атрибута и посчитать количество произведений этого атрибута. Например: при выборе размера 19 "(attribute.id 2)

**Size**
-- 19"

**Color**
-- White (1)
-- Black (1)

**Price**
-- <$100 (1)
-- $100-$300 (1)

Это будет запрос к attribute2product >> выберите продукт >> следующий запрос, чтобы выбрать другой атрибут этого продукта и отобразить имя атрибута, номер продукта, который теперь имеет имя атрибута ... (Как в Magento)

Спасибо

1 Ответ

3 голосов
/ 17 мая 2010

Я изменил запрос. Это должно быть то, что вы основали на своих обновлениях:

SELECT attribute.name AS attributename, COUNT(*) AS numofproducts FROM product 
  INNER JOIN attribute2product ON  attribute2product.productid = product.id
  INNER JOIN attribute ON attribute.id = attribute2product.attributeid
  WHERE product.id IN 
    (
     SELECT p.id FROM product AS p
     INNER JOIN attribute2product AS a2p ON a2p.productid = p.id
     WHERE a2p.attributeid = 2
    )
  GROUP BY attribute.id, attribute.name;

На основании ваших данных я получил:

  attributename   numofproducts
       19"              2
      White             1
      Black             1
      <$100             2

Для нескольких атрибутов ( на основе статьи более известного эксперта Quassnoi в блоге ):
Я удалил таблицу продуктов, поскольку здесь она не нужна

SELECT attribute.name AS attributename, COUNT(*) AS numofproducts
FROM attribute2product
  INNER JOIN attribute ON attribute.id = attribute2product.attributeid
  WHERE attribute2product.productid IN (
      SELECT o.productid
      FROM (
        SELECT productid 
        FROM (
          SELECT 2 AS att
          UNION ALL
          SELECT 6 AS att
          ) v
        JOIN attribute2product ON attributeid >= att AND attributeid <= att
        ) o
      GROUP BY o.productid
      HAVING COUNT(*) = 2
      )
  GROUP BY attribute.id, attribute.name

2, 6 относятся к 19" и White соответственно. COUNT(*) = 2 соответствует 2 атрибутам. Дополнительные атрибуты можно добавить, добавив следующее во вложенную производную таблицу:

          UNION ALL
          SELECT <attributeid> AS att

Как и ожидалось, результат запроса:

  attributename   numofproducts
       19"              1
      White             1
      <$100             1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...