2012-10-19 42 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

相关问题