0

データベースに3つのテーブルがあります。

  • 製品テーブル-+100000エントリ
  • 属性テーブル(製品の可能な属性のリスト)
  • 製品属性テーブル(製品の属性の値が含まれています)

8つのランダムな商品とその属性の1つ(attribute_id = 2)を探していますが、商品にこの属性がない場合は、クエリの戻り時に表示されるはずです。私のリターンは属性を持つ製品のみを表示し、他の製品を非表示にするため、成功した結果なしでいくつかのSQLクエリを試してきました。

私の3つのテーブルは次のようなものです。

CREATE TABLE `product` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `sku` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `name` varchar(90) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `provider_id` int(11) unsigned DEFAULT NULL,
  `url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `active` int(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `sku_UNIQUE` (`sku`)
) ENGINE=InnoDB AUTO_INCREMENT=123965 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `attribute` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT '',
  `data_type` varchar(50) DEFAULT '',
  PRIMARY KEY (`id`), 
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=latin1;

CREATE TABLE `product_attribute` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `product_id` int(11) unsigned NOT NULL,
  `attribute_id` int(11) unsigned NOT NULL DEFAULT '6',
 `value` longtext NOT NULL,
 PRIMARY KEY (`id`),
  UNIQUE KEY `product_id` (`product_id`,`attribute_id`)
) ENGINE=InnoDB AUTO_INCREMENT=869437 DEFAULT CHARSET=latin1;

そして、これは私が試したクエリの1つで、正しいと思いましたが、他のクエリと同じ問題があります...

SELECT product.id, product.sku, product.name,provider.name as provider_name,
product_attribute.value as author 
FROM (`product`)  
LEFT JOIN `provider` ON `product`.`provider_id` = `provider`.`id` 
LEFT JOIN `product_attribute` ON `product`.`id` = `product_attribute`.`product_id`
 WHERE `product`.`active` = '1' AND `product`.`url` IS NOT NULL 
AND (`product_attribute`.`attribute_id` = 8 OR `product_attribute`.`attribute_id` IS NULL) 
AND `product`.`provider_id` = '7' ORDER BY RAND() LIMIT 8

左、内側、右の結合を試しましたが、何も機能しません。

4

1 に答える 1

4

where句ではなく、左結合テーブルの条件を結合に入れる必要があります

...
from product
     left join provider ON product.provider_id = provider.id  
     left join product_attribute on product.id = product_attribute.product_id
               and product_attribute.attribute_id = 8
where `product`.`active` = '1' 
and `product`.`url` IS NOT NULL  
and `product`.`provider_id` = '7' 
...
于 2012-10-19T10:02:03.020 に答える