2010-08-12 54 views
3

我无法在查询中获得正确的结果。我使用MySQL和这里是我到目前为止有:SQL AND在连接表的列上

SELECT cpn, status, title, value_category, rating_category, parts.id 
FROM `vendors` 
INNER JOIN `vendor_parts` ON (`vendors`.`id` = `vendor_parts`.`vendor_id`) 
INNER JOIN `parts` ON (`parts`.`id` = `vendor_parts`.`part_id`) 
WHERE (concat(IFNULL(vendors.name,''),IFNULL(vendors.abbreviated_name,'')) 
    LIKE '%vendor1%' 
OR 
CONCAT(IFNULL(vendors.name,''),IFNULL(vendors.abbreviated_name,'')) 
    LIKE '%vendor2%') 
GROUP BY cpn 
HAVING COUNT(cpn)=2 
ORDER BY cpn 

的问题是,在部分表中的某些行,也有厂商表相同的供应商名称的多个行。因此,在结果集中,我将得到具有两个vendor1的零件,而不是vendor1和vendor2。我试图获得至少有vendor1和vendor2之一的零件。

任何想法?

+0

发生时我可能没有张贴我的答案后正确理解要求。您是否想要返回vendor1和vendor2的零件?或者您是否想要返回与%vendor1%匹配的第一个供应商以及与%vendor2%匹配的第一个供应商? – Russ 2010-08-12 15:03:16

+0

它需要两个。 – Audie 2010-08-12 15:44:41

回答

0

我可能是没谱,但如果你正在努力寻找双方vender1提供的零部件和vender2最好的策略是使用一个连接

SELECT cpn, status, title, value_category, rating_category, parts.id 
from `parts` 
inner join 
    (
     select distinct part_id from `vender_parts` join ON (`vendors`.`id` = `vendor_parts`.`vendor_id`) 
     WHERE concat(IFNULL(`vendors`.`name`,''),IFNULL(`vendors`.`abbreviated_name`,'')) LIKE '%vendor1%' 
    ) `vender1` on `vender1`.`part_id` = `parts`.`id` 
inner join 
    (
     select distinct part_id from `vender_parts` join ON (`vendors`.`id` = `vendor_parts`.`vendor_id`) 
     WHERE concat(IFNULL(`vendors`.`name`,''),IFNULL(`vendors`.`abbreviated_name`,'')) LIKE '%vendor2%' 
    ) `vender2` on `vender2`.`part_id` = `parts`.`id` 
group by cpn 
+0

那么你有几个语法错误,但除了它,它的工作很好!我不认为我会为此得到解决方案,嘿 – Audie 2010-08-18 17:16:53

0

这里的最佳解决方案是清理供应商表中的数据。我知道这可能是不可能的,但它确实是合并重复行的最佳解决方案。从长远来看,它会让你的生活更轻松。这也意味着您需要清理填充供应商表的代码,以确保它不会输入重复项。

为了弄清楚你的查询出了什么问题,请简化它。找出供应商表的select语句,以便只返回您感兴趣的供应商,然后在上面的内部连接中使用它。

选择vendor.id,vendor.name,从供应商那里 (CONCAT(IFNULL(vendors.name, ''),IFNULL(vendors.abbreviated_name, ''))LIKE '%的供应商1%' vendor.abbreviated_name OR CONCAT(IFNULL(vendors.name,''),IFNULL(vendors.abbreviated_name,''))LIKE'%vendor2%')

如果您只想从结果集中获取第一个供应商,请使用LIMIT命令。把一个ORDER BY,以确保你想要的那个是第一个返回的。

或者您可以使用GROUP BY对重复供应商进行分组。查看coalesce命令以处理空列值等。

+0

vendor和vendor_part表中的数据没有问题。部件被允许多次拥有相同的供应商,因为vendor_part可能具有不同的属性,即使它属于同一部件和同一供应商。 – Audie 2010-08-12 15:51:12

+0

如果你可以有多个vendor_parts,那很好。这是供应商和零件表之间的连接表。您需要整合供应商表中的供应商。 此外,您可能需要考虑在插入期间填充的供应商列中添加另一列,这是您搜索的关键。它会让你的查询更快,特别是如果你把它放在索引上。 – MonkeyWrench 2010-08-12 17:12:27

0

问题归结为SELECT匹配两个供应商1之前它找到第一个供应商2。

尝试使用UNION:

SELECT cpn, status, title, value_category, rating_category, parts.id 
FROM `vendors` 
INNER JOIN `vendor_parts` ON (`vendors`.`id` = `vendor_parts`.`vendor_id`) 
INNER JOIN `parts` ON (`parts`.`id` = `vendor_parts`.`part_id`) 
WHERE concat(IFNULL(vendors.name,''),IFNULL(vendors.abbreviated_name,'')) 
    LIKE '%vendor1%' 
GROUP BY cpn 
HAVING COUNT(cpn)=1 
UNION 
SELECT cpn, status, title, value_category, rating_category, parts.id 
FROM `vendors` 
INNER JOIN `vendor_parts` ON (`vendors`.`id` = `vendor_parts`.`vendor_id`) 
INNER JOIN `parts` ON (`parts`.`id` = `vendor_parts`.`part_id`) 
WHERE CONCAT(IFNULL(vendors.name,''),IFNULL(vendors.abbreviated_name,'')) 
    LIKE '%vendor2%' 
GROUP BY cpn 
HAVING COUNT(cpn)=1 
ORDER BY cpn 
+0

这可以找到其中一个供应商或两个供应商的零件。我只需要两个。 – Audie 2010-08-12 15:42:26

0

如前所述,你会想清除掉重复的供应商表,并重新映射的所有供应商的部件对于一个给定的供应商,以一个独特的供应商ID。我不确定您的问题是否有明确的解决方案。起初我还以为你也许可以只创建为供应商派生表只显示了一组不同的供应商和加盟,要在下面的例子中vendor_parts像:

SELECT 
    cpn , 
    status, 
    title, 
    value_category, 
    rating_category, 
    parts.id 
FROM  
    (select * from vendors where vendors.id in (select id from vendors group by vendors.name)) vendors 
    INNER JOIN vendor_parts 
    ON  (vendors.id = vendor_parts.vendor_id) 
    INNER JOIN parts 
    ON  (parts.id = vendor_parts.part_id) 
WHERE(
    concat(IFNULL(vendors.name,''),IFNULL(vendors.abbreviated_name,'')) LIKE '%vendor1%' 
    OR CONCAT(IFNULL(vendors.name,''),IFNULL(vendors.abbreviated_name,'')) LIKE '%vendor2%' 
    ) 
GROUP BY cpn 
HAVING COUNT(cpn)=2 
ORDER BY cpn 

这种方法的问题是,你可能将供应商部分绑定到具有相同名称和不同ID的两个供应商,如果使用group by创建派生表,那么当您将其加入vendor_parts时,该表最终会丢失一些供应商部分。

我个人专注于编写更新脚本来清理数据,而不是试图找到解决问题的方法。

享受!

+0

如果我将供应商名称限制为唯一,该怎么办?截至目前,数据库中的供应商名称是唯一的。 – Audie 2010-08-12 15:45:20

+0

其实我跑了查询,我仍然得到与两个相同的供应商名称的部分 – Audie 2010-08-12 15:47:55