2015-06-10 73 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