2017-07-27 78 views
0

得到名稱和顏色我知道這是後話,你很簡單,但我真的很confused.I有3個表MySQL查詢由3臺

**users** 
| id | username | 
--1------pesho--- 
--2------gosho--- 

**colors** 
| id | color | 
---1-----red--- 
---2---purple-- 

**user_color** 
| id | user_id | color_id | 
--1------1-----------2----- 
--2------2-----------1----- 

我應該怎麼構建我的查詢來獲取用戶pesho「最喜歡的顏色是purple。在第三張表中是關係。我試過惠特 SELECT 'users'.'username', 'colors'.'color' FROM 'users' LEFT JOIN 'user_color' ON 'users'.'id'='user_color'.'user_id' WHERE 'user_color'.'user_id'=1 但這也給我一個錯誤#1054 - Unknown column 'colors.color' in 'field list'。我應該如何構建它以取pesho的名字和他最喜歡的color - 紫色。這真是一團糟!先謝謝你!

+1

反引號和撇號是兩個不同的東西。小心輕放。 – Strawberry

+0

順便提一下,假設用戶只能擁有一種最喜歡的顏色,這是1-1關係,所以user_color表不是必需的。您可以將用戶的最愛存儲在用戶表中。 (如果沒有'u',寫'最愛'和'顏色'會感覺很奇怪) – Strawberry

回答

0

你是不是在你的SELECT查詢加盟user_color表到colors表。你需要做的:

SELECT `users`.`username`, `colors`.`color` FROM `users` 
    LEFT JOIN `user_color` ON `users`.`id`=`user_color`.`user_id` 
    LEFT JOIN `colors` on `colors`.`id` = `user_color`.`color_id` 
    WHERE `user_color`.`user_id`=1; 
+0

非常感謝!這是我正在尋找的!會接受你的答案。 –

+0

不,這不是外連接如何工作 – Strawberry

0

這將做什麼,你想要什麼

Select color from colors 
where colors.id in (select color_id from user_color 
where user_id in(select id from users 
where username="pesho")) 
+0

謝謝你的隊友!將查看您的查詢! –

+1

該查詢效率低下 - 最終生成3個不同的查詢而不是1個。如果表具有適當的外鍵,則JOIN查詢應優於子查詢。 – PressingOnAlways

+0

@PressingOnAlways我同意你的意見,但沒有提供有關外鍵的信息 –

0

這是非常基本的東西,涵蓋在任何初學者的手冊或在線教程。我只是回答,因爲到目前爲止提供的其他答案都是誤導性的。

DROP TABLE IF EXISTS users; 

CREATE TABLE users 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,username VARCHAR(12) NOT NULL 
); 

INSERT INTO users VALUES 
(1,'pesho'), 
(2,'gosho'); 


DROP TABLE IF EXISTS colors; 

CREATE TABLE colors 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,color VARCHAR(12) NOT NULL 
); 


INSERT INTO colors VALUES 
(1,'red'), 
(2,'purple'); 

DROP TABLE IF EXISTS user_color; 

CREATE TABLE user_color 
(user_id INT NOT NULL 
,color_id INT NOT NULL 
); 

INSERT INTO user_color VALUES 
(1,2), 
(2,1); 

SELECT u.* 
    , c.* 
    FROM users u 
    LEFT 
    JOIN user_color uc 
    ON uc.user_id = u.id 
    LEFT 
    JOIN colors c 
    ON c.id = uc.color_id 
WHERE u.id = 1; 
+----+----------+------+--------+ 
| id | username | id | color | 
+----+----------+------+--------+ 
| 1 | pesho | 2 | purple | 
+----+----------+------+--------+ 
+1

這正是@PressingOnAlways寫的 –

+0

不是,它是不同的。如果你在兩個查詢上執行'EXPLAIN EXTENDED [query]'後跟'SHOW WARNINGS;',那麼區別就會更加明顯。 – Strawberry