Как я могу выбрать необходимые записи? - PullRequest
0 голосов
/ 27 декабря 2010

Таблица:

  • Продукт: [id, name, brand_id, is_published]
  • Бренд: [id, name, is_published]
  • Награды: [id, name]
  • ProductAwards [product_id, award_id]

Как выбрать список ОПУБЛИКОВАННЫХ брендов вместе с количеством НАГРАД выставленных продуктов бренда.

Я отлично справляюсь со всей частью, за исключением ограничения "is_published" при подсчете наград.

Надеюсь, это ясно; кто-нибудь может просто подсказать, куда копать?

Ответы [ 5 ]

1 голос
/ 27 декабря 2010

Предполагая, что ссылочная целостность обеспечивается, и в таблице ProductAwards нет ошибочных записей, вам на самом деле не нужно выбирать из таблицы Awards:

SELECT B.Name, COUNT(PA.Award_ID) AS Num_Awards
  FROM Brand              AS B
  LEFT JOIN Product       AS P  ON P.Brand_ID = B.ID AND P.Is_Published = TRUE
  LEFT JOIN ProductAwards AS PA ON PA.Product_ID = P.ID
 WHERE B.Is_Published = TRUE

Если какой-либо бренд не имеет наград, COUNT (PA.Award_ID) вернет ноль, поскольку COUNT (столбец) считает количество ненулевых значений.

1 голос
/ 27 декабря 2010
SELECT b.name, count(pa.award_id) as Quantity
FROM PRODUCT p 
      LEFT JOIN Brand b ON p.brand_id = b.id
      LEFT JOIN ProductAwards pa on p.Product_id = pa.product_id
      LEFT JOIN Awards a ON a.award_id = pa.award_id
WHERE p.is_published = 1
GROUP BY b.name

Как-то так?

1 голос
/ 27 декабря 2010

Я предполагаю, что это запрос, который вы ищете:

SELECT Brand.name, COUNT(Awards.id) AS Awards
FROM Brand
LEFT JOIN Product ON product.brand_id = Brand.id AND Product.is_published = TRUE /* This may need to be changed based on the data type of is_published */
LEFT JOIN ProductAwards ON ProductAwards.product_id = Product.id
LEFT JOIN Awards ON Awards.id = ProductAwards.award_id
WHERE Brand.is_published = TRUE /* As with Product.is_published, this clause is dependent on the column's data type */

Для более информированного ответа вы можете опубликовать результаты SHOW CREATE TABLE для каждой из ваших таблиц, а также пример того, какой результат вы ищете. Надеюсь, это поможет!

0 голосов
/ 27 декабря 2010

Вы можете попробовать этот запрос, чтобы получить необходимое количество для каждого идентификатора бренда

SELECT b1.id, COUNT(pa.award_id) [No of awards]
FROM Brand1 b1 left join Product p
ON p.brand_id=b1.id AND p.is_published=1 AND b1.is_published=1
LEFT JOIN ProductAwards pa
ON pa.product_id = p.id
LEFT JOIN Awards a
ON a.id=pa.award_id
GROUP BY b1.id
0 голосов
/ 27 декабря 2010

Если у вас есть запрос, который (если я правильно прочитал вопрос) работает на 100%, за исключением опубликованного ограничения, сделав это ограничение тривиальным - просто добавьте AND is_published = 1 к предложению WHERE (или добавьте WHERE is_published = 1, если ваш запросне имеет предложения WHERE).

Выше предполагается, что is_published - это целое число, содержащее 0 или 1 для неопубликованных или опубликованных.Если столбец отличается, вам необходимо соответствующим образом изменить выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...