2017-07-27 62 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