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 名称匹配的表?的主要内容,如果未能解决你的问题,请参考以下文章