在单个SQL查询中使用两次不同的列值?

时间:2010-11-11 05:21:25

标签: sql mysql

我有一个名为“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

我想我已经搞砸了......任何人都可以帮忙吗?

5 个答案:

答案 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

<强>结果

alt text

答案 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

(假设只能为电影投票,不应该删除非电影,因为这些不应该存在。)