使用第一个表的输出从第二个表中选择特定数据
Posted
技术标签:
【中文标题】使用第一个表的输出从第二个表中选择特定数据【英文标题】:Select specific data from second table using output from first table 【发布时间】:2013-05-30 00:35:40 【问题描述】:我有两张桌子。一个是account
,另一个是client
表。用户将提供输入,在这种情况下是19
。我想要做的是我想ONLY从client
中选择一个name
,使用client_id
作为标识符并且只使用一个single 选择语句。我可以做两次选择查询,但这不是我想要的。
所以为了更好地解释它:用户输入例如 $id = 19
,我将使用来自account
表的id
来识别client_id
,在这种情况下是17
。然后,我将使用client_id
从client
表中选择name
。
account
表
client
表
我已经看过 join
和 left join
了,但我仍然卡住了。请帮我解决一下这个。提前致谢。
我当前不工作的代码:
$sql = " SELECT account.id, client.client_id\n"
. " FROM account, client\n"
. " WHERE account.id = 19";
【问题讨论】:
为什么你的查询中有换行符......这不好...... 【参考方案1】:一个简单的内部连接就可以完成任务
$query = "select
account.id,client.client_id
from
account
join
client
on
account.client_id = client.client_id
where
account.id = 19";
【讨论】:
【参考方案2】:您需要指定用于连接两个表的列。
关于 SQL 语言的一个不幸事实是,默认行为是通过将一个表中的每一行与另一个表中的每一行进行匹配来连接两个表。也就是说,每个可能的配对都是结果集的一部分。 SQL 没有任何方法可以推断您要使用哪些列作为连接条件,因此您必须自己指定条件。
这里有一个更好的查询形式:
$sql = " SELECT account.id, client.client_id
FROM account JOIN client USING (client_id)
WHERE account.id = 19";
请使用JOIN
语法。自 1992 年以来,它一直是在 SQL 中进行连接的标准方式。逗号样式的语法仅用于向后兼容 1992 年之前的 SQL。它们的执行方式完全相同,但 1992 年的语法可以进行外连接,并且更易于阅读。
PS:php 支持多行字符串,因此无需像您那样将字符串连接在一起。这是 Java 的习惯。
【讨论】:
更好的是,对多行字符串使用 HEREDOC。比在任何地方都嵌入换行符要容易得多。 Heredocs 很好,但多行字符串也隐式包含换行符。无需使用“\n”。 我只想要这个名字,所以它就像这样SELECT client.name FROM account JOIN client USING (client_id) WHERE account.id = 19
感谢您的想法和帮助。我很感激。【参考方案3】:
这应该使用INNER JOIN
:
SELECT c.name
FROM Client C
INNER JOIN Account A ON C.Client_Id = A.Client_Id
WHERE A.Id = 19
您的查询正在生成笛卡尔积,因为您没有在任何字段上加入表。
A Visual Explanation of SQL Joins【讨论】:
它确实有效,但我不明白这个东西c.name
、Client C
、Account A
等等。这个c
和C
是什么意思?就像您在查询中声明一个新的临时变量一样?无论如何感谢您的帮助。
@sg552 -- np,很高兴我们能提供帮助。关于“a”和“c”,它们只是表上的别名——无需输入 Client.Name 或 Client.Client_Id 的简写形式,您只需输入 c.name 或 c.Client_Id。最好的问候。【参考方案4】:
您没有加入帐户和客户。 此外,您只需要客户端名称,并且查询必须是:
Select distinct client.client_name from account, client where client.client_id=account.account_id and account_id=19
【讨论】:
对于给定的account_id,只有一个client_id,因此只有一个client_name 嗯,我看到的只是强制过滤器account.id = 19
。这样,您将获得一个且只有一个 client_id
这里和那里的一些固定后它工作:) SELECT DISTINCT client.name FROM account, client WHERE client.client_id = account.client_id AND id =19 LIMIT 0 , 30
再次感谢【参考方案5】:
$sql = " SELECT account.id, client.client_id
FROM `account`
INNER JOIN `client` ON `client`.client_id = `account`.`client_id`
WHERE account.id = 19";
【讨论】:
请考虑添加一个注释,解释您的 SELECT 语句。 @Trinimon,这就是互联网的用途。周围有很多文档。有时您只想要答案,否则就是英语。如果你不知道join是什么意思,解释也无济于事【参考方案6】:由于您没有提供有关客户表结构的信息,这只是一个猜测:
SELECT account.id, client.client_id
FROM account, client
WHERE account.id = 19
AND account.client_id = client.id
【讨论】:
【参考方案7】:也许你应该试试:
$sql = "SELECT account.id, client.client_id
FROM account, client
WHERE account.client_id=client.id AND account.id = 19 "
【讨论】:
【参考方案8】:这应该为你做 选择 c.name, c.client_id, a.id from account a left join on client c on a.client_id = c.client_id 其中 a.id = 19
【讨论】:
以上是关于使用第一个表的输出从第二个表中选择特定数据的主要内容,如果未能解决你的问题,请参考以下文章
如果一个表的列等于第二个表中的列,则在第三个表中插入值,python - mysql