2012-10-19 38 views
0

我有一個數據庫三個表:加入兩個表只有一個值是否爲空或特定數量

  • 產品表 - 100000項
  • 屬性表(的產品的可能的屬性列表)
  • 產品attribtue表(包含產品的屬性值),我找了8級隨機的產品及其屬性的一個

(attribute_id = 2),但如果一個產品有沒有這ATTR ibute它應該出現在查詢的返回處。我一直在嘗試一些沒有任何成功的結果的SQL查詢,因爲我的返回只顯示具有該屬性的產品並隱藏其他結果。

我的三個表是這樣的:

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; 

這是我試過的查詢之一,我認爲這是正確的,但它也有同樣問題的其他...

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 

我正在嘗試與左,內部和右連接,沒有任何作品。我將衷心感謝您的幫助。

謝謝!

+0

是否有可用的 – SRIRAM

+0

提供商表是的,它是。我忘了寫在帖子上,但它並不重要。不管怎麼說,還是要謝謝你! – mcamara

回答

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' 
... 
+0

它的工作原理,但它真的很慢,有沒有任何方法使此查詢更快? – mcamara

+0

您應該使用'explain'來確定導致性能問題的原因。缺乏適當的指標通常是原因。 – podiluska

相關問題