在MYSQL中查看3个表

在MYSQL中查看3个表,mysql,sql,view,Mysql,Sql,View,我在mysql中有3个表 table 1 date name total recieve 2013-05-09 "aa" 20 15 2013-05-09 "bb" 10 17 table 2 name tree "bb" "a1" "aa" "a2" table 3 date tree users 2013-05-09 "a1SI" 19 2013-05-09 "a1NO"

我在mysql中有3个表

table 1
date        name   total recieve
2013-05-09  "aa"    20    15
2013-05-09  "bb"    10    17

table 2
name    tree
"bb"     "a1"
"aa"     "a2"

table 3
date          tree      users
2013-05-09   "a1SI"      19
2013-05-09   "a1NO"      24
2013-05-09   "a2SI"      39
2013-05-09   "a2NO"      22
我需要一个带树表的视图

这是我需要的观点:

date         name   tree   total    recieve    userSI    userNO  
2013-05-09   "aa"   "a2"    20        15        39         22
2013-05-09   "bb"   "a1"    10        17        19         24
我有一半的疑问

SELECT t1.`date` , t1.`name` , t2.`tree` , t1.`total` , t1.`recieve`,
FROM  `table1` t1
INNER JOIN  `table2` t2 ON t1.`name` = t2.`name` 
ORDER BY  `t1`.`date` DESC

但我不知道如何使用三个表查看,其他问题是树的记录,因为我有树“a1”、“a1Si”和“a2NO”在视图中,我需要关联3列

,您应该能够使用以下内容将
t2.tree
上的
表3
t3.tree
的左两个字符连接起来:

SELECT t1.`date` , t1.`name` , t2.`tree` , t1.`total` , t1.`recieve`,
  max(case when right(t3.tree, 2) = 'SI' then t3.users end) usersSI,
  max(case when right(t3.tree, 2) = 'NO' then t3.users end) usersNO
FROM  `table1` t1
INNER JOIN  `table2` t2 
  ON t1.`name` = t2.`name` 
INNER JOIN `table3` t3
  on t2.tree = left(t3.tree, 2)
group by t1.`date` , t1.`name` , t2.`tree` , t1.`total` , t1.`recieve`
ORDER BY  `t1`.`date` DESC;

这也可以使用表3中的多个联接来完成:

SELECT t1.`date` , t1.`name` , t2.`tree` , t1.`total` , t1.`recieve`,
  t3SI.users usersSI,
  t3NO.users usersNO
FROM  `table1` t1
INNER JOIN  `table2` t2 
  ON t1.`name` = t2.`name` 
LEFT JOIN `table3` t3SI
  on t2.tree = left(t3SI.tree, 2)
  and right(t3SI.tree, 2) = 'SI'
LEFT JOIN `table3` t3NO
  on t2.tree = left(t3NO.tree, 2)
  and right(t3NO.tree, 2) = 'NO'
ORDER BY  `t1`.`date` DESC;
看。您会注意到,我更改了最后两个联接,以使用
左联接
,如果不存在与
SI
NO
匹配的树,则您将返回数据。如果您知道将有匹配的数据,那么可以使用内部联接

如果树名较长,则可以在JOIN中实现LIKE子句:

SELECT t1.`date` , t1.`name` , t2.`tree` , t1.`total` , t1.`recieve`,
  t3SI.users usersSI,
  t3NO.users usersNO
FROM  `table1` t1
INNER JOIN  `table2` t2 
  ON t1.`name` = t2.`name` 
LEFT JOIN `table3` t3SI
  on t3SI.tree like concat(t2.tree, '%')
  and right(t3SI.tree, 2) = 'SI'
LEFT JOIN `table3` t3NO
  on t3NO.tree like concat(t2.tree, '%')
  and right(t3NO.tree, 2) = 'NO'
ORDER BY  `t1`.`date` DESC;

请参见

尝试与第三个表进行两次内部联接,如下所示:

    SELECT t1.'date' , t1.'name' , t2.'tree' , t1.'total' , t1.'recieve',
      t31.users usersSI,
      t32.users usersNO
    FROM  'table1' t1
    INNER JOIN  'table2' t2 
      ON t1.'name' = t2.'name' 
    INNER JOIN 'table3' t31
      on t2.tree = left(t31.tree, 2) AND right(t31.tree, 2) = 'SI'
    INNER JOIN 'table3' t32
      on t2.tree = left(t32.tree, 2) AND right(t32.tree, 2) = 'NO'
    group by t1.'date' , t1.'name' , t2.'tree' , t1.'total' , t1.'recieve'
    ORDER BY  't1'.'date' DESC;

但是当我做max(case when right(t3.tree,2)=‘SI’然后t3.users end)usersSI时,max(case when right(t3.tree,2)=‘NO’然后t3.users end)usersNO。只显示一条记录,我有80条记录,其中userSI和userNO@BenitoCamelas参见我的编辑,你也可以使用多个连接来获得结果。哦,问题是当你离开(t3SI.tree,2)时,如果一棵树的aname有5个字母,而不是working@BenitoCamelas你应该在你的原始帖子中包含所有必要的细节。您也可以尝试在JOIN中使用LIKE子句。@BlueFoots为意外的否决投票(以及随后的奇怪编辑来解锁投票)感到抱歉。我一定是在没有意识到的情况下疯狂地点击了。现在投票吧!