我需要在 SQL 中使用左连接、自然连接还是简单连接?
Posted
技术标签:
【中文标题】我需要在 SQL 中使用左连接、自然连接还是简单连接?【英文标题】:Do I need a left, natural or simple join in SQL? 【发布时间】:2018-09-05 05:56:24 【问题描述】:我是 php 编码的新手,我只是想修复我的网站上的一些功能,这些功能是首席开发人员遗留下来的。
网站[Vloggi] 是一个市场。所以我需要在assignments page 中显示职位海报的名称。我有工作的表只有 ID,没有名称。
所以我需要加入,但我已经尝试过,但它破坏了整个网站。
SQL 有 17 个表,我需要显示表 3 中包含的用户名 (usr_name),表 7 中包含的组织 (usrg_orgname) 以及表 14 中的职位发布用户 (vlop_usr_id) 详细信息。
主键是users.usr_id,与users_gor.usrg_usr_id和vlog-ops.vlog_usr_id链接。
表 3:users
usr_id, usr_email, usr_password, usr_fbuser, usr_fbtoken, usr_name, usr_loc_name, usr_loc_lat1, usr_loc_lon1, usr_loc_lat2, usr_loc_lon2, usr_status, usr_gor, usr_vgr, usr_token, usr_regtoken,
表 7:users_gor
usrg_usr_id,usrg_creditops,usrg_creditvlog,usrg_creditvlogette,usrg_destination,usrg_orgname,usrg_orgtype,usrg_location,usrg_website,usrg_jobtitle,usrg_phone,usrg_address1,usrg_address2,usrg_state,usrg_postcode,usrg_country
表 14:vlog-ops
vlop_id, vlop_title, vlop_description, vlop_tags, vlop_deadline, vlop_quantity, vlop_quantityposted, vlop_vser_id, vlop_usr_id,vlop_loc_name, vlop_loc_lat1, vlop_loc_lon1, vlop_loc_lat2, vlop_loc_lon2, vlop_campaign, vlop_rules, vlop_tips, vlop_status
所以在 main.php 中我编写了以下 Sql 查找 在 main.php 中,我有以下 SQL 查找:
$sql = "SELECT * FROM users_gor WHERE usrg_usr_id = ".$db->quote($user_info['usr_id'])." LIMIT 1";
$rows = $db->select($sql);
$users_gor = $rows[0];
$sql = "SELECT * FROM users_vgr WHERE usrv_usr_id = ".$db->quote($user_info['usr_id'])." LIMIT 1";
$rows = $db->select($sql);
$users_vgr = $rows[0];
$sql = "SELECT * FROM users WHERE usr_id = ".$db->quote($user_info['usr_id'])." LIMIT 1";
$rows = $db->select($sql);
$users = $rows[0];
$sql = "SELECT * FROM vlog-ops WHERE vlop_usr_id ".$db->quote($user_info['usr_id'])." LIMIT 1";
$rows = $db->select($sql);
$users = $rows[0];
$sql = "SELECT usr_name AS vlop_usr_name FROM users WHERE usr_id = ".$db->quote($user_info['usr_id'])." LIMIT 1";
$rows = $db->select($sql);
$users = $rows[0];
然后在页面模板本身,我已经写了
<?php echo $vlop['vlop_vser_id'] ?>
<?php echo $vlop['vlop_usr_name'] ?>
第一个有效,第二个无效。我最终想要的是在表格中显示用户名和组织名称。
每当我尝试 JOIN 或 NATURAL JOIN 或 LEFT JOIN 时,它都会中断并且整个站点变为空白。
对新手的任何帮助将不胜感激。
【问题讨论】:
当您尝试 JOIN 时,您的代码是什么样的?在我看来,它确实有点像经典的 JOIN 场景...... 发布您的加入代码,并准确解释它的破坏方式。 感谢@Alan 我使用的 JOIN 如下 $sql = "SELECT usr_name FROM users NATURAL JOIN vlog-ops WHERE usr_id = ".$db->quote($user_info['usr_id'])添加到main.php的时候整个站点都变白了,是不是应该直接添加到页面而不是回显呢? 谢谢@PauloHgo 您还必须验证它返回的内容,因为您假设总是有结果,也许它什么也不返回并且您访问位置 0 【参考方案1】:当您使用 JOIN 时,您需要指定加入它们的方式。 在下面的查询中,我假设您正在从您的问题中查找粗体字段。
$query='SELECT u.usr_name, g.usrg_orgname, v.vlop_usr_id FROM users u
JOIN vlog-ops v on u.usr_id = v.vlop_usr_id
JOIN users_gor g on u.usr_id = g.usrg_usr_id';
我相信我得到了正确的字段名称,但如果不是用正确的名称替换它们。
获取数据后,您只需遍历结果:
$result = mysqli_query($connection, $query);
while($row = mysqli_fetch_assoc($result))
echo 'User name = ' . $row['u.usr_name'];
echo 'Org name = ' . $row['g.usrg_orgname'];
echo 'Job posting user id = ' . $row['v.vlop_usr_id'];
【讨论】:
我认为明确说明连接的类型总是更好 - 它使您的意图对读者更清楚。所以 INNER JOIN 或 LEFT JOIN 或 RIGHT JOIN 或 CROSS JOIN。在实践中,很少有我会使用 NATURAL JOIN 来隐式使用关系的情况——最好像 Paulo 所做的那样阐明连接条件。 谢谢。我尝试将该代码插入控制器页面,然后再次将整个站点插入白色, $sql = "SELECT u.usr_name, g.usrg_orgname, v.vlop_usr_id FROM users u JOIN vlog-ops v on u.usr_id = v.vlop_usr_id JOIN users_gor g on u.usr_id = g。 usrg_usr_id; 您是否尝试在 MySql Workbench 中或直接在客户端中运行该查询? PHP 代码之外的查询本身的结果是什么? 嗨 @PauloHgo PHPMyAdmin 说这是 ER_PARSE_ERROR #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 '-ops v on u.usr_id = v.vlop_usr_id JOIN users_gor g on u.usr_id = g.usr_usr_i' 附近使用正确的语法以上是关于我需要在 SQL 中使用左连接、自然连接还是简单连接?的主要内容,如果未能解决你的问题,请参考以下文章