2015-06-10 48 views
0

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

考虑下表:

用户

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

位置

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

现在,当我选择用户,我得到类似

数组

什么,我想得到的回复是:

[ 
    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来做什么。

+0

Mysql只会返回行。然后你可以在你想要的结构中处理这个数组 –

+0

你使用php和你的mysql吗? –

+0

如何在mysql中使用任何ORM ..这可能是一个好的开始 - > http://www.doctrine-project.org/ –

回答

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”表示如果不存在位置,则在结果中需要城市和州的空值。

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

+0

感谢知识伙伴,我很感激。 – r3wt

1

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

重要的是要记住MySql返回行,所以在你的例子中,如果讨论用户可以有几个位置你不会使用连接 - 或如果您使用连接,您将拥有多行用户标识和他拥有的不同位置。

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

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

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

+0

用户只能有一个位置。 – r3wt

+0

@ r3wt如果用户只能拥有一个位置,为什么你需要一个带有数组的位置结构? – Jens

+0

@Jens User对象存储在一个中央Redis数据存储中以便快速访问(作为'NS \ User'类型的会话对象。因此,我们希望在用户会话中保留尽可能多的数据以实现快速访问,并且全局数据同步到memcache以便快速访问和更新(写入后面),因此用户拥有一个位置,并且在与该位置相关的某些页面上检索特定的* things。 – r3wt