2014-10-10 55 views
0

說,如果我有一個數據庫結構有點像這樣:從多張表中選擇,然後加入到兩個,在MySQL

CREATE TABLE person (
    idPerson INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name  VARCHAR(50) 
); 

CREATE TABLE detailTypes (
    type   INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    field   VARCHAR(50) 
); 

CREATE TABLE details (
    idPerson  INT NOT NULL, 
    idDetailType INT NOT NULL, 
    value   VARCHAR(50) 
); 

有了這些數據:

|----------|---------| 
| idPerson | Name | 
|----------|---------| 
| 1  | Tom  | 
| 2  | Dick | 
| 3  | Harry | 
|----------|---------| 

|----------|----------| 
| type  | field | 
|----------|----------| 
| 1  | Diet  | 
| 2  | Hat size | 
|----------|----------| 

|----------|------|------------| 
| idPerson | type | value  | 
|----------|------|------------| 
| 1  | 1 | Vegetarian | 
| 1  | 2 | Medium  | 
| 2  | 2 | Small  | 
|----------|------|------------| 

而且我要的結果它看起來像這樣:

|----------|----------|------------| 
| Name  | field | value  | 
|----------|----------|------------| 
| Tom  | Diet  | Vegetarian | 
| Tom  | Hat Size | Medium  | 
| Dick  | Diet  | NULL  | 
| Dick  | Hat Size | Small  | 
| Harry | Diet  | NULL  | 
| Harry | Hat Size | NULL  | 
|----------|----------|------------| 

我會認爲,糾正我,如果我錯了,應該實現這個查詢應該看起來像:

SELECT name, field, value 
FROM person p, detailTypes t 
LEFT JOIN details d 
    ON p.idPerson = d.idPerson AND t.type = d.type 

但MySQL的(32年5月5日)/ PHPMyAdmin中抱怨說, 「 '上條款' 未知列 'p.idPerson'」。你可以圍繞:

SELECT name, field, value 
FROM detailTypes t, person p 
LEFT JOIN details d 
    ON p.idPerson = d.idPerson AND t.type = d.type 

它有相同的抱怨,除了t.type現在是未知的。

目前的解決方案是一個[戰慄]嵌套查詢,如下:

SELECT name, field, value 
FROM (
    SELECT type, field, idPerson 
    FROM person p, detailsType t 
) pt 
LEFT JOIN pt.idPerson = p.idPerson AND pt.type = t.type 

這是一個已知的問題與MySQL?這是我的第一次查詢是錯誤的嗎?我可以做得更好嗎?因爲它似乎並不適合我......

+0

你已經有了四個答案。至少你可以表現出一些熱情,不是嗎? – amenadiel 2014-10-10 11:57:10

+0

糾正你的架構第一 – Karunakar 2014-10-10 12:12:31

+0

@amenadiel給我第二個傢伙,我打字了這個,然後去了一些食物;) – 2014-10-10 12:12:32

回答

1

任何表中都沒有「type」字段。你是否打算使用idDetailType?請嘗試以下操作:

SELECT * 
FROM detailTypes t 
JOIN person p 
LEFT JOIN details d ON p.idPerson = d.idPerson AND t.idDetailType = d.idDetailType 

然後細化的結果,以避免使用骯髒*

PD:字段和值是保留關鍵字。因此,可能會出現一些意想不到的行爲。

+0

「JOIN person p」上沒有「ON」子句...... – 2014-10-10 12:19:56

+0

哦,你不需要它!你每天都會學到新東西;) – 2014-10-10 12:26:34

1

我還沒有評論的狀態,所以我寫在這裏。 你有沒有試過將'p'和't'值設置爲表格的主鍵?

+1

因爲你寫的查詢對我來說似乎沒有問題。 – RKrogh 2014-10-10 11:49:10

+0

Heya @RKrogh - 是的,查詢工作正常,我只是想知道是否有可能在沒有嵌套查詢的情況下以不會導致MySQL錯誤的方式進行。 Upvoted雅讓你多一點地位... – 2014-10-10 12:21:18

+0

感謝一堆!能夠發表評論將有助於保持網站的良好結構。 我看到查詢已解決。大! – RKrogh 2014-10-10 13:04:57

0

您只需使用一個單一的查詢

SELECT p.name, t.field, dt.value 
    FROM person p INNER JOIN detailTypes dt ON p.idPerson=dt.idPerson 
    LEFT JOIN details d ON d.idDetailType=dt.idDetailType 
+0

這已經被試過了&是錯誤的原因,請看問題;) 我同意你btw,我認爲*應該*是正確的查詢,但它會導致錯誤在mysql中陳述... – 2014-10-10 12:16:38

+0

嘗試檢查更新的答案 – CapitanFindus 2014-10-10 12:20:59

0

試試這個:

SELECT temp.name, temp.typeName as field, d.value 
FROM (select * from person, detailTypes) temp 
LEFT JOIN details d 
ON temp.idPerson = d.idPerson AND temp.typeName = d.idDetailType 
+0

這是對在問題中嘗試的最後一個查詢的重寫;我目前使用的那個。它當然有用,但我想知道是否有更好的查詢,因爲我不認爲這是正確的... – 2014-10-10 12:18:04

+1

我不這麼認爲 – Karunakar 2014-10-10 12:18:54

+0

我的模式+查詢有點不一致 - 我的錯。你的答案和舊模式一樣正確,但他們的工作卻是我的工作,但實際的查詢在工作方式上非常相似...... – 2014-10-10 12:25:32