学习使用SQL的高级功能

时间:2015-06-10 05:44:09

标签: mysql join

如果我想提升自己的职业生涯,我需要学习使用更高级的SQL功能。我承认我不知道连接是什么或如何使用它们。我开始用连接阅读查询,我的大脑变得糊涂了,但我遇到了一种情况,我可能会从使用连接中受益,但我不知道我想做什么甚至可能。

考虑以下表格:

用户

id  | user_name | location_id
===============================
1   | r3wt      | 316

位置

id  | state | city
=========================
316 | Clarksville | Arkansas

现在,当我选择用户时,我会找回像

这样的数组
[ 
    id => 1, 
    user_name => r3wt , 
    location_id =>316
]

我想回来的是:

[ 
    id => 1, 
    user_name => r3wt , 
    location_id =>[
        id=>316,
        city=>Clarksville,
        state=>Arkansas
    ]
]

我想知道这是否可能,如果是这样,我怎么可能改变我的相当乏味的选择查询,使这成为可能。谢谢,如果你需要更多的细节或者想要让我自己想出一个可怜的尝试,我愿意让自己难堪学习。谢谢

我可怜的小尝试当然不起作用:

SELECT id, user_name, location AS location_id
FROM user JOIN location ON location.id = user.location_id

请记住,我完全不知道自己在做什么。我甚至不了解连接是什么以及它们是如何工作的,但我理解我希望能用SQL做什么。

2 个答案:

答案 0 :(得分:2)

你应该:

SELECT u.id, u.name, u.location_id, l.city, l.state
 FROM  user u    -- identify columns from user table with 'u.'
 LEFT OUTER JOIN location l -- identify columns from location with 'l.'
   ON u.location_id = l.id --- the join predicate when the two ids match 
 WHERE l.state = 'Arkansas' -- other selection criteria

这将为您提供几乎你想要的东西,但是作为单个平面阵列: -

[ 
    u.id => 1, 
    u.user_name => r3wt , 
    u.location_id => 316,
    l.city=>Clarksville,
    l.state=>Arkansas
]

SQL结果始终是二维表。这是SQL工作方式的基础! " LEFT OUTER"表示如果没有位置,您希望结果中的城市和州的空值。

只是google" MYSQL TUTORIAL"你会发现许多网站免费提供在线指南。因为我在史前学到了所有这些东西,所以不能推荐一个特定的。

答案 1 :(得分:1)

联接用于组合2个或更多表以从中获取结果。有几种类型的联接,你可以在这里阅读它们:http://www.w3schools.com/sql/sql_join.asp

重要的是要记住,MySql在您的示例中返回行,如果讨论中用户可以有几个您不会使用连接的位置 - 或者如果您使用连接,则将有多行用户ID和他有不同的地点。

在您的示例中,对于具有一行位置的用户,您可以运行此查询

SELECT *
FROM user
INNER JOIN location
ON user.location_id=location.id;

此查询将返回具有位置记录的所有用户的行,您将获得两个表的所有字段(如我们所使用的*)。