sql JOIN 导致双行

Posted

技术标签:

【中文标题】sql JOIN 导致双行【英文标题】:sql JOIN cause double rows 【发布时间】:2020-05-17 06:13:30 【问题描述】:

我有两张桌子需要加入它们

我使用这个 sql 查询创建的第一个表

CREATE TABLE `users` (
  `id` bigint PRIMARY KEY AUTO_INCREMENT,
  `user_login` varchar(60),
  `user_pass` varchar(255),
  `first_name` varchar(30),
  `last_name` varchar(30),
  `user_status` int(2),
  `user_phone_number` varchar(20),
  `user_email` varchar(100),
  `user_billing_info` text,
  `user_temp_units` int(2),
  `user_flow_units` int(2),
  `user_notes` text
);

第二张桌子

CREATE TABLE `station_meta` (
  `uid` VARCHAR(25) PRIMARY KEY,
  `nickname` varchar(30),
  `install_date` date,
  `latatude` numeric(10,6),
  `longitude` numeric(10,6),
  `firmware_ver` varchar(10),
  `weir_type` int(2),
  `weir_width` numeric,
  `dist_to_ground` numeric,
  `dist_to_weir` numeric,
  `service_fee` numeric,
  `notes` text
);

当我使用这个 sql 查询时,我得到了双行

SELECT * FROM station_meta JOIN users

注意:如果需要提及,uid 类似于 9C9Z454Z5CA

所以在另一个表中没有任何列是相同的

更新

数据样本

我的结果

我在 foreach 的 php 函数中使用它,所以我得到了双重结果

感谢任何帮助

【问题讨论】:

更新您的问题,添加适当的数据样本、您的实际结果、您的预期结果并解释 2 个表是如何连接的(2 个表中的哪些列用于连接) @scaisEdge 好的,现在就这样做 @scaisEdge 请检查,我更新了问题,我使用我提到的简单查询加入了他们,table1 JOIN table2 我没有使用任何列进行连接,我尝试使用 table1 作为 z JOIN table2 as x in z.id=x.uid 但这没有意义,因为 uid 与 id 不同 看你的结果..你没有重复的行(在第一行中 uid 和 nicname 是重复的,但不是昵称)。你在两个表之间只有一个笛卡尔积(事实上你没有加入元素并减少结果)..所以你应该添加你的预期结果 对不起@scaisEdge 我真的很困惑,您对此有何建议或解决方案?是什么导致双排? 【参考方案1】:

您似乎错过了两个表之间的关系.. 如果你想避免笛卡尔积并只检索两个表之间的匹配值,你应该添加一个关系为

table user_station_meta (
    `id` bigint PRIMARY KEY AUTO_INCREMENT,
    user_id bigint
    station_meta_uid VARCHAR(25)
)

once you have inserted the matching values  

uid,        id
9c2748..    1
BC8CD4..    5

你可以选择单个匹配结果为

select u.*. s.*
from  user_station_meta us
JOIN station_meta s on s.uid = us.uid
JOIN users u on u.id = us.id

【讨论】:

以上是关于sql JOIN 导致双行的主要内容,如果未能解决你的问题,请参考以下文章

SQL Select - Union 结合 Join 查询导致错误

Join导致冗余数据引起慢SQL

SQL IF 和 LEFT JOIN 导致数据库出现故障

关于SQL 查询效率问题 left join 改成 inner join union

资深java工程师写mysql表子查询left join导致大事务-线上事故

MySql 之 left join 查询结果