【问题标题】:MySQL JOIN query syntax with duplicate field - "database.table.field"具有重复字段的 MySQL JOIN 查询语法 - “database.table.field”
【发布时间】:2016-02-01 00:40:39
【问题描述】:

我在同一个数据库中拥有这两个 MySQL 表,我正在将其用于类似网站的论坛。我的问题是关于基于两者之间的“user_id”链接加入表“主题”内的新字段的正确查询。

表“users”,其中字段“user_id”在注册时创建,自动递增:

用户
╔═════════╦══════════╦═══════════╦══════════╦═════ ═══╗
║ user_id ║ 用户名 ║ 名字 ║ 姓氏 ║ 等等... ║
╠═════════╬══════════╬═══════════╬══════════╬═════ ═══╣
║ 1 ║ JJJJ ║ 约翰 ║ 约翰逊 ║ 等等... ║
║ 2 ║ MMMM ║ Max ║ Maxman ║ 等等... ║
║ 3 ║ AAAA ║ 亚历克斯 ║ 亚历克森 ║ 等等... ║
╚═════════╩══════════╩═══════════╩══════════╩═════ ═══╝

表格“topics”,其中“user_id”取自另一个表格,当任何用户提交您通常称为论坛网站上的新主题的内容时。

主题
╔══════════╦═════════════╦═══════════════════╦════ ═════╦═════════╗
║ topic_id ║ 描述 ║ 日期时间 ║ user_id ║ 等等 ... ║
╠══════════╬═════════════╬═══════════════════╬════ ═════╬═════════╣
║ 1 ║ bla bla ║ dd mon yyyy hh:mi ║ 3 ║ 等等... ║
║ 2 ║ bla bla ║ dd mon yyyy hh:mi ║ 3 ║ 等等... ║
║ 3 ║ bla bla ║ dd mon yyyy hh:mi ║ 2 ║ 等等... ║
╚══════════╩═════════════╩═══════════════════╩════ ═════╩═════════╝

我可以确认在 PHP 中成功建立了与数据库的连接。数据库名称是“网站”。我正在运行以下查询但没有成功,因为我希望成为您在第三个表中看到的结果(右连接最后一个字段)。

mysql_query("SELECT topics.user_id, users.user_id
 FROM website.topics
JOIN website.users ON topics.who_posted_hangout;");
主题
╔══════════╦═════════════╦═══════════════════╦════ ═════╦═════╦═══════════════════╗
║ topic_id ║ 描述 ║ 日期时间 ║ user_id ║ 等 ║ 用户名 ║
╠══════════╬═════════════╬═══════════════════╬════ ═════╬═════╬═══════════════════╣
║ 1 ║ bla bla ║ dd mon yyyy hh:mi ║ 3 ║ 等 ║ AAAA ║
║ 2 ║ bla bla ║ dd mon yyyy hh:mi ║ 3 ║ 等 ║ AAAA ║
║ 3 ║ bla bla ║ dd mon yyyy hh:mi ║ 2 ║ 等 ║ MMMM ║
╚══════════╩═════════════╩═══════════════════╩════ ═════╩═════╩═══════════════════╝

我使用了一个我在某个地方看到的示例来编写查询,但有些东西对我来说没有意义:

  • Q1:在我写查询的例子中,为什么他实际从两个表中选择数据时只提到了“FROM”的1个表?
  • Q2:关于上面的问题,这个查询会不会因为 user_id 是两个表中的字段而出现异常?
  • Q3:我看到您可以使用此语法选择“table1.field1”。过去,我也在查询中看到“database1.table1”。哦,如您所见,我实际上在查询中使用了这种格式/语法(考虑到“网站”是数据库的名称)。您是否可以并且应该有时像这样选择:“database1.table1.field1”,正是因为“user_id”是重复的,每个表中都有一个? - 由于两个点,崇高文本不会将“3-way.3-way.3-way”识别为正确的语法。
  • Q4:最后同样重要的是,为什么我的查询不起作用,如果您知道问题所在,可以修改它吗? :-/?


提示:如果你想在stackoverflow问题中显示这样的表格,请使用http://www.sensefulsolutions.com/,复制unicode艺术结果,并将其放在<pre> </pre>标签之间。

【问题讨论】:

  • 在第一季度,虽然他没有在 FROM 子句中包含 website.users,但它是通过在连接中引用它来推断的。通过在连接中包含该字段,该表被假定为可用于查询。
  • 1. website.users 上的连接允许您从两个表中获取数据。
  • 2.这些列由表名引用,例如topics.user_idusers.user_id。如果你只有user_id,你会得到一个查询错误。

标签: php mysql join


【解决方案1】:

尝试:

'SELECT * FROM topics INNER JOIN users ON topics.user_id = users.user_id WHERE topics.user_id = the_user_id';

【讨论】:

  • 不是user_id,不是id_user :P?
  • @Matt 是的 :p 我的错误
  • 它说“'where 子句'中的未知列'the_user_id'”。不应该自动创建该字段,然后从此查询中填充所有字段吗?我还尝试在运行查询之前更改表并添加该字段。这样,它不会给我任何错误,但字段值仍然为 NULL。
  • 如果您选择特定的user_id,这只是一个示例。否则只需运行SELECT * FROM topics INNER JOIN users ON topics.user_id = users.user_id
  • 哦,“特定的 user_id”,我假设您的意思是 3 或 17,对吧?
【解决方案2】:

在第一季度,虽然他没有在 FROM 子句中包含 website.users,但它是通过在连接中引用它来推断的。通过在连接中包含该字段,该表被假定为可用于查询。

Q2:在这两种情况下,对 user_id 的引用都带有表名:users.userid、topics.user_id。如果他在没有表名的情况下使用 user_id,就会出错。

Q3:是的……你是对的!

Q4:我不能 100% 确定您希望您的查询选择什么,所以我没有建议......但如果您进一步解释一下,也许我们可以提供帮助。

【讨论】:

  • 谢谢你,我得到了你对 Q1 和 Q2 的解释。 Q3,所以选择像“database.table.field”是不正确的?但是,如果我连接到两个数据库,每个数据库都包含同名的表,该怎么办?运行“SELECT * FROM website.topics.title;”在 PhpMyAdmin 中给了我错误。 Q4:在上面这些人的帮助下解决了,谢谢大家:D
  • 使用“AS”例如:SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 WHERE t1.name = t2.name; AS 函数允许您为表指定不同的名称。我用它来缩短表名,但它也可以用来给两个具有相同名称、唯一名称的表。您可以在dev.mysql.com/doc/refman/5.7/en/select.html 看到更多示例
  • 知道了。希望我可以选择这两个答案作为解决我问题的答案...无论如何,再次感谢您,先生,美好的一天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多