【问题标题】:MySQL INNER JOIN two tables where one table contains multiple rows with same idMySQL INNER JOIN 两张表,其中一张表包含具有相同 id 的多行
【发布时间】:2016-11-01 10:17:15
【问题描述】:

我想从一个表中获取 id,这取决于另一个表中具有相同 id 的多行。只有当另一个表中的所有行都与每个行请求匹配时,才必须返回 ID。我的表结构看起来像这样。

tbl_one ------------------ id 公司名称 ------------------ 1 公司一 2 公司二 tbl_two ----------------------------------------- id类型内容 ----------------------------------------- 1 邮政编码 54321 1 类汽车经销商 2 邮政编码 54321 2类超市

我已经尝试过 INNER JOIN,但无论我如何尝试,我似乎都无法使其工作。

选择 tbl_one.id FROM tbl_one 内部联接 tbl_two 在 tbl_two.id = tbl_one.id 在哪里 ( 类型 = '邮政编码' AND 内容 = '54321' ) 和 ( 类型 = '类别' AND 内容 = '汽车经销商' )

谁能回答我的查询有什么问题? 谢谢你:)

【问题讨论】:

  • 中间的AND应该是OR——类型不能同时是zipcode和category,与content类似。
  • 问题是“type”-column 有不止一行具有匹配的 id,因此其中可以同时包含“zipcode”和“category”值。因为我只想在两行都为真时返回 id,所以我需要使用 AND 而不是 OR。

标签: mysql join


【解决方案1】:

嗯..试试这个:-

/*
drop    table tbl_one;
drop    table   tbl_two;

create  table tbl_one(id int, companyName varchar(20)) ;
Insert into tbl_one values
(1,  'CompanyOne'), 
(2,  'CompanyTwo')  ;

create  table tbl_two(id int,type varchar(20), content varchar(20));
insert into tbl_two values
(1 ,  'zipcode'  ,   '54321'),
(1 ,  'category' ,   'Car dealers'),
(2 ,  'zipcode'  ,   '54321'),
(2 ,  'category' ,   'Supermarkets');
*/
SELECT t1.*
FROM  tbl_one t1
WHERE t1.id in (select t2.id from tbl_two t2 where t2.id = t1.id and t2.type = 'zipcode' AND t2.content = '54321')
and     t1.id in (select t3.id from tbl_two t3 where t3.id = t1.id and t3.type = 'category' AND t3.content = 'Car dealers')

【讨论】:

  • 谢谢 :) 这似乎对我有用。我希望它也适用于大桌子。现在我正在处理 +1000 万条记录,但到目前为止,我似乎做得非常快。
【解决方案2】:

您提供的查询不起作用,因为 tbl_two.type 不能同时等于“zipcode”和“category”。 Perhaps this is what you meant? 请注意第 7 行的 OR 运算符,而不是您使用的 AND...

SELECT one.id
FROM tbl_one one
JOIN tbl_two two
ON   two.id = one.id
WHERE
     two.type = "zipcode" AND two.content = "54321"
OR   two.type = "category" AND two.content = "car dealers"

或者您可能想查找 54321 中的所有汽车经销商,在这种情况下您需要两个连接...

SELECT one.id
FROM tbl_one one
JOIN tbl_two one_zip
ON   one_zip.id = one.id
AND  one_zip.type = "zipcode"
AND  one_zip.content = "54321"
JOIN tbl_two one_cat
ON   one_cat.id = one.id
AND  one_cat.type = "category"
AND  one_cat.content = "car dealers"

【讨论】:

  • 第二次查询做他想做的事,第一次没有
  • 第二个查询完成了这项工作。我想这将归结为您和 P.Salmon 答案之间的性能测试
猜你喜欢
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多