在slq中的不同表中查找相同的列

时间:2017-12-04 05:29:45

标签: mysql sql database

我有一个小问题,我有四个表,我使用的是mysql数据库

调查表此处将创建所有调查。

╔══════════╤════════╗
║ SurveyId │ Name   ║
╠══════════╪════════╣
║ 1        │ First  ║
╟──────────┼────────╢
║ 2        │ Second ║
╚══════════╧════════╝

量表类别表

╔════════════╤═════════════╗
║ CategoryId │ Title       ║
╠════════════╪═════════════╣
║ 1          │ Stress      ║
╟────────────┼─────────────╢
║ 2          │ Environment ║
╟────────────┼─────────────╢
║ 3          │ Health      ║
╚════════════╧═════════════╝

将Gauge Category表与Survey表连接,

我使用另一个名为标题表

的表

标题表

此处 title1,title2和title3 Gauge Category表的外键,而 surveyId Survey表<的外键< / em>的

╔══════════════╤════════╤════════╤════════╤══════════╗
║ GaugeTitleId │ title1 │ title2 │ title3 │ surveyId ║
╠══════════════╪════════╪════════╪════════╪══════════╣
║ 1            │ 2      │ 3      │ 1      │ 1        ║
╟──────────────┼────────┼────────┼────────┼──────────╢
║ 2            │ 1      │ 3      │ 2      │ 1        ║
╟──────────────┼────────┼────────┼────────┼──────────╢
║ 3            │ 3      │ 1      │ 2      │ 2        ║
╚══════════════╧════════╧════════╧════════╧══════════╝

另一个名为 Average_values 的表格,其各自的标题表

Average_values表

╔═════════╤════════╤════════╤════════╤══════════╤══════════════╗
║ GaugeID │ Gauge1 │ Guage2 │ Gauge3 │ SurveyId │ GaugeTitleId ║
╠═════════╪════════╪════════╪════════╪══════════╪══════════════╣
║ 1       │ 34     │ 76     │ 23     │ 1        │ 1            ║
╟─────────┼────────┼────────┼────────┼──────────┼──────────────╢
║ 2       │ 56     │ 23     │ 67     │ 1        │ 1            ║
╟─────────┼────────┼────────┼────────┼──────────┼──────────────╢
║ 3       │ 14     │ 28     │ 56     │ 1        │ 2            ║
╚═════════╧════════╧════════╧════════╧══════════╧══════════════╝

我的问题是,如果我想从 Average_values表获取压力值,我该如何获取?因为外键不正常。输出应 23,56,28 。有没有办法得到它?我还有另一种想法,即将 Average_values表修改为

╔═════════╤════════╤════════════╤══════════╗
║ GuageId │ values │ CategoryId │ SurveyId ║
╚═════════╧════════╧════════════╧══════════╝

并逐个放置值,这里CategoryId和SurveyID分别在 Gauge类别表 Survey Table 的外键关系中。但我觉得,它不会是一个有效的表。因为很多数据都想动态处理。

2 个答案:

答案 0 :(得分:1)

我觉得你的桌面设计很奇怪,我认为其中2个桌子需要“不透明”才能删除某些字段上的1,2,3个后缀。关于你的其余问题是什么仍然是个谜。没有明确的方法可以加入名为 Guage 的表格,但下面有一个 CategoryID 键是一个执行“unpivot”并尝试加入所有表格的查询

SQL Fiddle

MySQL 5.6架构设置

CREATE TABLE Survey 
    (`SurveyId` int, `Name` varchar(6))
;

INSERT INTO Survey 
    (`SurveyId`, `Name`)
VALUES
    (1, 'First'),
    (2, 'Second')
;


CREATE TABLE Gauge 
    (`CategoryId` int, `Title` varchar(11))
;

INSERT INTO Gauge 
    (`CategoryId`, `Title`)
VALUES
    (1, 'Stress'),
    (2, 'Environment'),
    (3, 'Health')
;


CREATE TABLE Title 
    (`GaugeTitleId` int, `title1` int, `title2` int, `title3` int, `surveyId` int)
;

INSERT INTO Title 
    (`GaugeTitleId`, `title1`, `title2`, `title3`, `surveyId`)
VALUES
    (1, 2, 3, 1, 1),
    (2, 1, 3, 2, 1),
    (3, 3, 1, 2, 2)
;


CREATE TABLE Average_values 
    (`GaugeID` int, `Gauge1` int, `Guage2` int, `Gauge3` int, `SurveyId` int, `GaugeTitleId` int)
;

INSERT INTO Average_values 
    (`GaugeID`, `Gauge1`, `Guage2`, `Gauge3`, `SurveyId`, `GaugeTitleId`)
VALUES
    (1, 34, 76, 23, 1, 1),
    (2, 56, 23, 67, 1, 1),
    (3, 14, 28, 56, 1, 2)
;

查询1

select
        t.surveyId
      , t.GaugeTitleId
      , g.title Gauge_Title
      , case when cj.n = 1 then t.title1 
             when cj.n = 2 then t.title2
             when cj.n = 3 then t.title3
        end Title
      , case when cj.n = 1 then av.Gauge1 
             when cj.n = 2 then av.Guage2
             when cj.n = 3 then av.Gauge3
        end Gauge
from Title t
cross join (
  select 1 n union all
  select 2 n union all
  select 3 n) cj
inner join Average_values av on t.surveyId = av.surveyId
                            and t.GaugeTitleId = av.GaugeTitleId
inner join Gauge g on t.GaugeTitleId = g.CategoryId  
where g.title = 'Stress'
order by Title, Gauge

<强> Results

| surveyId | GaugeTitleId | Gauge_Title | Title | Gauge |
|----------|--------------|-------------|-------|-------|
|        1 |            1 |      Stress |     1 |    23 |
|        1 |            1 |      Stress |     1 |    67 |
|        1 |            1 |      Stress |     2 |    34 |
|        1 |            1 |      Stress |     2 |    56 |
|        1 |            1 |      Stress |     3 |    23 |
|        1 |            1 |      Stress |     3 |    76 |

答案 1 :(得分:0)

如果gauge1, gauge2, gauge3出现相同的概念,则没有理由创建多个字段。

这是数据库设计中的“错误”。

您应该规范化表格并为每个值设置一行。  关系数据库引擎旨在以这种方式工作。 通过互联网查看关系数据库规范化,了解更多信息。