SQL - 加入 t1.value 与 t2.column 名称匹配的表?

Posted

技术标签:

【中文标题】SQL - 加入 t1.value 与 t2.column 名称匹配的表?【英文标题】:SQL - Join table where t1.value matches t2.column name? 【发布时间】:2020-02-25 09:14:28 【问题描述】:

我有以下 2 个包含调查设置和调查数据的表格。

这个想法是通过 调查问题(在 设置 中定义为一个值)与匹配的 调查问题 连接两个表> 数据表的列,提取该问题的调查分数。

如何根据值 + 列组合连接 2 个表,然后提取特定调查的调查分数?

我目前只从调查数据表中获取数据,但我在设置中缺少category 列,这使得很难对网站上的输出进行分类,因为我不想一次显示所有数据。下面我的php供参考:

    $sql = "SELECT * FROM `survey_data` WHERE `Survey ID` = '".$id."'";
    $result = $db->query($sql);         // check if record exists based on ID number

    if($result->num_rows > 0)          // if record is found, proceed accordingly

        if(!$result = $db->query($sql)) 
            die('There was an error getting survey details for record ' . $id . ' [' . $db->error . ']'); 

        $row = mysqli_fetch_assoc($result);
        foreach($row as $column => $value) 
            if ( $value != '' ) 
                echo "
                          <tr>
                            <td>$column</td>
                            <td>$value</td>
                          </tr>";
            
        

感谢任何帮助,谢谢。

【问题讨论】:

你的表设计有些问题,因为两张表之间没有明确的主外键关系。 关系将是设置表中的问题值和包含调查数据表的问题答案的列名。问题是这种关系不是传统的价值对价值,而是价值对列。 列名的值并不是真正应该如何设置数据库。 不,不,不。修复您的架构。数据库表不是电子表格 @Strawberry 遗憾地不是一个选项,因为survey_data 内容来自 csv 导入,其中列标题名称来自系统生成的标题,因此间距。 【参考方案1】:

使用这个查询:

SELECT * FROM survey_data sd inner join setting_table st on sd.Survey ID = st.setting ID WHERE `Survey ID` = '".$id."'

它将返回两个表中的所有列,但仅匹配。并像这样检索数据。

while($row = $result->fetch_assoc()) 
        echo "survey question: " . $row["question"]."<br>";
    

现在您还可以获取相应行的类别

【讨论】:

谢谢你,但查询没有返回任何结果。表名和列是正确的,即使我删除了Survey ID = XXX 部分,即使它应该显示所有行,它仍然没有结果。 请注意,您的查询将Survey_ID 与不相同的Setting_ID 匹配,而 st.question 和 sd.column_name 是相同的。【参考方案2】:

查询比较乱,但你可以采取蛮力的方法:

select t2.survey_id, t1.category, t1.question,
       (case when t1.question = 'Check-in Experience' then t2.`Check-in Experience`
             when t1.question = 'Check-out Experience' then t2.`Check-out Experience`
             when t1.question = 'Breakfast Experience' then `Breakfast Experience`
        end) as value
from table1 t1 cross join
     table2 t2
where t2.survey_id = ?
having value is not null;

【讨论】:

以上是关于SQL - 加入 t1.value 与 t2.column 名称匹配的表?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle性能诊断艺术-读书笔记

SQLite):删除行后自动更新两个表中的索引

sql____001

C++-new(p) T1(value);

Oracle SQL CURSOR 更新与加入和提交

有条件地加入 - COALESCE 与 OR - Oracle SQL