【问题标题】:Which MySQL JOIN do I use?我使用哪个 MySQL JOIN?
【发布时间】:2011-08-09 02:28:15
【问题描述】:
SELECT comments.comment, comments.title, userBase.uID, userBase.fname FROM comments JOIN userBase WHERE comment.ID=users.ID AND comments.uID='$uID' AND comments.title='$title' 

但是,这仅在使用时为我提供了 cmets 数据库中的信息:

$row = mysql_fetch_row($result);
    print_r($row);

【问题讨论】:

  • 在改正我的错字之后:$result = mysql_query("SELECT comments.comment, comments.title, userBase.uID, userBase.fname FROM comments INNER JOIN userBase ON comments.uID=userBase.uID AND comments.uID='$uID' AND comments.title='$title'")or die(mysql_error()); $row = mysql_fetch_row($result); print_r($row);

标签: php mysql join


【解决方案1】:

如果我理解正确你想要什么,这就是查询

SELECT comments.comment, comments.title, userBase.uID, userBase.fname 
FROM comments 
INNER JOIN userBase ON comment.ID=users.ID 
                    AND comments.uID='$uID' 
                    AND comments.title='$title'

无论如何你的问题有几个问题:

  • 我假设 commentsuserBase 是表,不是数据库
  • AND 就在 WHERE 子句之后,这完全没有意义
  • 不清楚是什么关系。您确定要将comments.ID 等同于userBase.ID 吗?在这种情况下,您使用 ID 键作为 cmets 中的外键,这不是很可读。你可能想使用类似comments.user_id

编辑:为了清楚起见,连接有另一种语法,它使用WHERE 关键字。您可以将上面的内容重写为

SELECT comments.comment, comments.title, userBase.uID, userBase.fname 
FROM comments, userBase 
WHERE comment.ID=users.ID 
  AND comments.uID='$uID' 
  AND comments.title='$title'

但这不是 SQL 标准。它适用于 MySQL,我认为也适用于 SQLServer,但我不完全确定其他数据库供应商。无论如何,您的查询的问题在于您混合了两种不同的语法。

【讨论】:

  • AND 是剪切和粘贴错字,至于 id,是的,我为此截断了我的实际变量。感谢您的信息。
  • Andrea 在 JOIN 中不使用“WHERE”的原因是什么?
  • 连接有另一种语法,使用 WHERE。但是你把两者混在一起了。
【解决方案2】:

试试这个:

SELECT c.comment, c.title, u.uID, u.fname
FROM comments c, userBase u
WHERE c.ID = u.ID
and c.title = '$title'
and c.uID = '$uID'

我假设您的所有变量都已初始化并具有一定的价值。对于主键,您不需要围绕值使用 ' (引号)。此外,您需要选择是使用 JOIN 样式语句还是 WHERE = 样式语句。

这里是关于 JOINS 和 WHERE = 语句的更多信息。 http://www.w3schools.com/sql/sql_join.asp http://www.w3schools.com/sql/sql_where.asp

【讨论】:

  • 废话!我永远不会推荐逗号分隔的语法。总是更好地推荐 ISO Join 语法。
  • @Thomas 你为什么不推荐逗号分隔的语法?
  • @Fred - 很多原因。首先,当 ISO/ANSI 语法出现时,它就已经过时了。那是 1989 年。其次,某些类型的连接根本无法使用该语法完成。第三,您的意图使用 ISO 语法更清晰(即更易于阅读)。您是否打算创建交叉连接?通过查看 From 子句无法判断。读者需要深入研究 Where 子句才能找到答案。此外,连接条件都与过滤条件混为一谈。在这个阶段使用逗号分隔的语法确实没有任何充分的理由。
  • @Thomas 啊,我明白了,我打算做一个内部连接,但我还在学习。如果其他人偶然发现此问题,这会有所帮助。http://stackoverflow.com/questions/3595526/pros-cons-of-mysql-joins
【解决方案3】:

内连接将为您提供两个表中满足连接条件的所有行,此连接条件在 on 子句中指定(您已省略)。相比之下,左连接将为您提供连接中左表(第一个表)中的所有行,以及右表中满足连接条件的任何行,而右连接则相反。

我认为您在 SQL 中寻找的是:

SELECT comments.comment, comments.title, userBase.uID, userBase.fname 
FROM comments INNER JOIN userBase ON comment.ID=users.ID 
WHERE comments.uID='$uID' AND comments.title='$title'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多