20
回答
mysql两表联合查询,两个表结构一样,多个字段中的3个字段,只要这3个字段有重复的就罗列出来
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
a表与b表字段都是相同的,字段为:
险种,车牌,发动机号,车大架号
现在想实现的是:
只要a表的险种与b表的险种相同,并且a表的车牌,发动机号,车大架号与b表的车牌,发动机号,车大架号只要3个中的一个相同,则显示出来相同的记录。
a表创建及记录:
DROP TABLE IF EXISTS `a`; 
CREATE TABLE `a` ( 
  `xianzhong` varchar(30) DEFAULT NULL, 
  `chepai` varchar(20) DEFAULT NULL, 
  `fadongji` varchar(30) DEFAULT NULL, 
  `chejiahao` varchar(30) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=gbk; 
INSERT INTO `a` VALUES ('DAA','吉B3120挂','无',''); 
INSERT INTO `a` VALUES ('DZA','吉B3120挂','无',''); 
INSERT INTO `a` VALUES ('DAA','暂未上牌','ABCD','无'); 
INSERT INTO `a` VALUES ('DAA','吉B3146挂','无',''); 
INSERT INTO `a` VALUES ('DZA','吉B3146挂','无',''); 

b表创建及记录:
DROP TABLE IF EXISTS `b`;
CREATE TABLE `b` (
  `xianzhong` varchar(30) DEFAULT NULL,
  `chepai` varchar(20) DEFAULT NULL,
  `fadongji` varchar(30) DEFAULT NULL,
  `chejiahao` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
INSERT INTO `b` VALUES ('DAA','吉B3120挂','无','LH9B3G40090HHT174');
INSERT INTO `b` VALUES ('DZA','吉B3120挂','无','LH9B3G40090HHT174');
INSERT INTO `b` VALUES ('DAA','吉B12345','','1345');
INSERT INTO `b` VALUES ('DAA','吉B3146挂','无','LH9B3G40990HHT173');
INSERT INTO `b` VALUES ('DZA','吉B3146挂','无','LH9B3G40990HHT173');

a表及b表及想要的结果图片如下,请大家bangbang忙,实在想不到该怎么查询了,先谢谢大家了。

a表

a表

b表

想要的查询结果

sql语句该怎么写呢?

举报
于洋
发帖于6年前 20回/16K+阅

以下是问题补充:

  • @于洋 :这么说吧,一辆 车牌为 吉B3120 挂的车 在2011年3月1日上了险种为DAA,DZA两种险,截止到2012年3月1日,当时还不知道发动机号或者车大架号,也可能还为上牌,但是车牌,发动机号,大架号肯定有一项是填了的 到2012年3月1日又开始续保,还是DAA,DZA两种险,这回有大架号了,就把大架号填上了。 我要查询的就是2011年3月1日上险了 到2012年3月1日看看续保没有 不知道我说的清楚没 a表是2011年3月1日 b表是2012年3月1日 (6年前)
共有20个答案 最后回答: 5年前

引用来自“莊博堯”的答案

引用来自“木人mr”的答案

对于你问题的描述,我实在很无语。

就拿你的例子, 你那个吉B3120 车子,数据有两条,其中险种 DAA,DZA ,

如果你这个车子到 2012年3月1日续保一种险种? 那么你的结果还有没有他?

 

你对问题的描述我实在很理解。 对问题我加以提炼。希望我没有理解错误。
按照你想获取更多信息的原则,我的理解就是,从B表中查询,如果险种跟车辆在A表中出现过,就是想要的结果。并且结果显示尽可能多的信息。(车牌,发动机号,车大架号)三个条件任选其一可以确定一个车辆。

并且你的数据库结构以及内容很不规范,有些信息用的是'',有些用的是'无' ,还有'暂未上牌'.  对于不知道的,应该全部是NULL

SELECT DISTINCT TA.xianzhong, IFNULL(TA.chepai, TB.chepai) AS  chepai, IFNULL(TA.fadongji, TB.fadongji) AS  fadongji, IFNULL(TA.chejiahao, TB.chejiahao) AS  chejiahao
FROM a TA, b TB
WHERE TA.xianzhong = TB.xianzhong 
AND (TA.chepai = TB.chepai OR TA.fadongji = TB.fadongji OR TA.chejiahao = TB.chejiahao)

主要问题不是查询困难, 主要问题是 数据库结构以及数据库数据相当不靠谱。
要想让上面查询结果正常,应该首先整理数据,把所有结果是'','无','暂未上牌'等等这些没意义的数据转换成NULL才能工作。

 

完全暸解您對, 'NULL', '無', '暂未上牌' 的不満, 但是樓主的 '無', '暂未上牌' 是合理的數據, 說不定是使用者當時輸入的數據或是合格數據, 必需接受, 就是麻煩一點必要時要判斷.

你的 SQL 好像並沒有滿足 樓主的需求?? "只要a表的险种与b表的险种相同,并且a表的车牌,发动机号,车大架号与b表的车牌,发动机号,车大架号只要3个中的一个相同,则显示出来相同的记录。"

如你所说 “完全暸解您對, 'NULL', '無', '暂未上牌' 的不満, 但是樓主的 '無', '暂未上牌' 是合理的數據, 說不定是使用者當時輸入的數據或是合格數據, 必需接受, 就是麻煩一點必要時要判斷.”

那么只好修改SQL 语句,而不是修改数据库内容。 给出了以下查询:

SELECT DISTINCT TA.xianzhong, IFNULL(IF(TA.chepai IN ('','无',' ','暂未上牌'),NULL,TA.chepai), IF(TB.chepai IN ('','无',' ','暂未上牌'),NULL,TB.chepai)) AS  chepai,
IFNULL(IF(TA.fadongji IN ('','无',' '),NULL,TA.fadongji), IF(TB.fadongji IN ('','无',' '),NULL,TB.fadongji)) AS fadongji,
IFNULL(IF(TA.chejiahao IN ('','无',' '),NULL,TA.chejiahao), IF(TB.chejiahao IN ('','无',' '),NULL,TB.chejiahao)) AS chejiahao
FROM a TA, b TB
WHERE TA.xianzhong = TB.xianzhong 
AND (
IF(TA.chepai IN ('','无',' ','暂未上牌'),NULL,TA.chepai) = IF(TB.chepai IN ('','无',' ','暂未上牌'),NULL,TB.chepai)
OR IF(TA.fadongji IN ('','无',' '),NULL,TA.fadongji) = IF(TB.fadongji IN ('','无',' '),NULL,TB.fadongji)
OR IF(TA.chejiahao IN ('','无',' '),NULL,TA.chejiahao) = IF(TB.chejiahao IN ('','无',' '),NULL,TB.chejiahao)
)

看着语句, 不知道你身体的某个部位会不会突然一紧。 
对于这样的数据库应用。我头皮发麻才是真的。

对于你的评论,我真不感赞同。

--- 共有 4 条评论 ---
泡不烂的凉粉回复 @于洋 : 那就选择最佳答案啊。 我还能得2分 6年前 回复
于洋感谢 木人mr 和 莊博堯 两位 以及所有来帮助我的兄弟们 我先谢谢你们了。 6年前 回复
莊博堯今天學了 IFNULL, 但看不懂, 第一個就不暸解. 6年前 回复
泡不烂的凉粉顺便提点, 以上查询包含 字符串,如果要是按照逻辑,必要时候加上 判断。 是不是应该加上 编码转换? 或者加上 set names 'gbk' ? 6年前 回复

SELECT a.xianzhong,a.chejiahao,a.chepai,a.fadongji FROM a a,b b WHERE b.xianzhong=a.xianzhong and (b.chepai=a.chepai or b.fadongji=a.fadongji or b.chejiahao=a.chejiahao)

 

我这样写的,不知道对不对。。。

--- 共有 3 条评论 ---
用户已屏蔽@于洋 那就无能为力了,哈哈 没空去想它了 6年前 回复
于洋不对的 6年前 回复
用户已屏蔽好像这儿要 SELECT a.xianzhong,a.chejiahao,a.chepai,a.fadongji 要换成你要的表的相应字段 比如 b.chejiahao 6年前 回复

有高手给了这句

select b.* from a left join b on a.xianzhong=b.xianzhong where ( (a.chepai=b.chepai) + (a.fadongji=b.fadongji) + (a.chejiahao=b.chejiahao) )>1

你们帮我看看怎么样?

引用来自“于洋”的答案

有高手给了这句

select b.* from a left join b on a.xianzhong=b.xianzhong where ( (a.chepai=b.chepai) + (a.fadongji=b.fadongji) + (a.chejiahao=b.chejiahao) )>1

你们帮我看看怎么样?

這可以在你完全不知道數據庫內容下達成嗎?

好像没有達到 "只要a表的险种与b表的险种相同......" 需求???

"select b.* from a left join b..." 不等於 "只要a表的险种与b表的险种相同......"

--- 共有 2 条评论 ---
fanyinlin这句目前没问题,但是数据如果更多的话肯定不行 高手继续优化 6年前 回复
于洋我需要进一步测试 目前跟少的条数是实现了 6年前 回复

这么说吧,一辆 车牌为 吉B3120 挂的车 在2011年3月1日上了险种为DAA,DZA两种险,截止到2012年3月1日,当时还不知道发动机号或者车大架号,也可能还为上牌,但是车牌,发动机号,大架号肯定有一项是填了的 

到2012年3月1日又开始续保,还是DAA,DZA两种险,这回有大架号了,就把大架号填上了。

我要查询的就是2011年3月1日上险了 到2012年3月1日看看续保没有 不知道我的清楚没

select a.* from a left join b on a.xianzhong=b.xianzhong 
where ( (a.chepai=b.chepai) + (a.fadongji=b.fadongji) + (a.chejiahao=b.chejiahao) )>1
union
select b.* from b left join a on a.xianzhong=b.xianzhong 
where ( (a.chepai=b.chepai) + (a.fadongji=b.fadongji) + (a.chejiahao=b.chejiahao) )>1

对于你问题的描述,我实在很无语。

就拿你的例子, 你那个吉B3120 车子,数据有两条,其中险种 DAA,DZA ,

如果你这个车子到 2012年3月1日续保一种险种? 那么你的结果还有没有他?

 

你对问题的描述我实在很理解。 对问题我加以提炼。希望我没有理解错误。
按照你想获取更多信息的原则,我的理解就是,从B表中查询,如果险种跟车辆在A表中出现过,就是想要的结果。并且结果显示尽可能多的信息。(车牌,发动机号,车大架号)三个条件任选其一可以确定一个车辆。

并且你的数据库结构以及内容很不规范,有些信息用的是'',有些用的是'无' ,还有'暂未上牌'.  对于不知道的,应该全部是NULL

SELECT DISTINCT TA.xianzhong, IFNULL(TA.chepai, TB.chepai) AS  chepai, IFNULL(TA.fadongji, TB.fadongji) AS  fadongji, IFNULL(TA.chejiahao, TB.chejiahao) AS  chejiahao
FROM a TA, b TB
WHERE TA.xianzhong = TB.xianzhong 
AND (TA.chepai = TB.chepai OR TA.fadongji = TB.fadongji OR TA.chejiahao = TB.chejiahao)

主要问题不是查询困难, 主要问题是 数据库结构以及数据库数据相当不靠谱。
要想让上面查询结果正常,应该首先整理数据,把所有结果是'','无','暂未上牌'等等这些没意义的数据转换成NULL才能工作。

 

--- 共有 3 条评论 ---
于洋你的完全在理,我现在也被打败了。 这样的数据实在是太不靠谱了,我都有死的心了。 6年前 回复
泡不烂的凉粉回复 @于洋 : 做能做的,既然数据库内容有了。剩下的就是自己处理数据了。 化繁为简, 把复杂的事情换做几个简单的事情。 处理数据,很简单,从规范的数据中找答案也很简单,如果一定要在这不规范的数据库上直接用一条SQL获取结果。 真的..... 6年前 回复
于洋首先,表的结构与内容都不是我所能左右的,我是要实现客户的要求,对于客户的表字段内容的多种方式,我也很头疼,有可能是无,也有可能是“/”或者空。客户只要结果。 6年前 回复
顶部