我有一个名为“User”的mySQL表,其中包含多个混合值:
[user_id] [user_email] [birthday]
---------------------------------
1 x@xxx.com 01/01/1981
2 y@yyy.com 02/02/1982
3 z@zzz.com 03/03/1983
我有另一个名为“Name”的表,其中包含用户的名字,还有一些像这样的电影:
[node_id] [name] [user_id]
----------------------------------
9 John Doe 1
10 Star Wars 90
11 Mike Smith 2
12 Mary Lord 3
13 Rocky III 91
最后,我有一个名为“投票”的第三个表,其中是用户和他喜欢的一些电影之间的关系。
[vote_id] [node_id] [user_id]
------------------------------
1 10 1
2 10 2
3 13 1
12 10 3
13 13 2
我正在努力做的是为两个不同的东西拉两次“name”值的查询:用户名和他喜欢的电影名。像这样:
[user_id] [user_name] [Birthday] [movie_name]
-------------------------------------------------
1 John Doe 01/01/1981 Star Wars
2 Mike Smith 02/02/1982 Star Wars
1 John Doe 01/01/1981 Rocky III
3 Mary Lord 03/03/1983 Rocky III
2 Mike Smith 02/02/1982 Rocky III
SELECT user.id,
node.name,
user.birthday,
IF(node.type = "movie", node.name, "")
FROM user,
node
JOIN vote ON vote.user_id = user.user_id
WHERE user.id = node.id
我想我已经搞砸了......任何人都可以帮忙吗?
答案 0 :(得分:1)
您的数据库结构错误。将用户名存储在第一个表“用户”
中答案 1 :(得分:1)
我强烈建议您将user_name存储在users表中。通过该更改,您可以获得更简单的查询和正确规范化的架构。
新提出的架构。
用户表
(添加了user_name列)
[user_id][name][user_email][birthday]
1 name1 x@xxx.com 01/01/1981
2 name2 y@yyy.com 02/02/1982
3 name3 z@zzz.com 03/03/1983
节点表(调用此电影)
(删除用户条目和user_id列,因为您将使用投票将这些条目链接到用户)
[node_id] [name]
10 Star Wars
11 Mike Smith
12 Mary Lord
13 Rocky III
投票表(称之为movies_users)
(删除了vote_id列,因为它只是一个连接表)
[node_id] [user_id]
10 1
10 2
13 1
10 3
13 2
然后你的查询应该是这样的:
select users.user_id, users.name, users.birthday, nodes.name as movie_name
from users
join votes on users.id = votes.user_id
join nodes on votes.node_id = nodes.node_id
答案 2 :(得分:1)
假设您的架构正是您在上面发布的内容,那么这应该是逐字的。
<强>查询强>
SELECT user.user_id,
node.name user_name,
user.birthday,
(select node.name from node where node_id = vote.node_id) as movie_name
FROM user
JOIN node ON user.user_id = node.user_id
JOIN vote ON vote.user_id = user.user_id
<强>结果强>
答案 3 :(得分:0)
选择user_id,user_name,birthday,name 来自用户,姓名,投票
where(在这里你做了一个表中的user_id之类的连接等于另一个表中的user_id) 但是这里有一个问题让我无法理解如何编写正确的代码,你在两个不同的表中有2个字段,user_name和name,你想用这个名字加入表吗?我不明白。)我认为你正在将电影名称与用户名混合,请重新提出问题
答案 4 :(得分:0)
我同意其他答案,如果您将用户名移动到用户表中,您会更好。但是,如果您对当前的表结构感兴趣,请尝试以下操作:
SELECT user.id,
uname.name user_name,
user.birthday,
movie.name movie_name
FROM user
JOIN node uname ON uname.user_id = user.user_id
JOIN vote ON vote.user_id = user.user_id
JOIN node movie ON vote.node_id = movie.id
(假设只能为电影投票,不应该删除非电影,因为这些不应该存在。)