我对SQL很新,我认为这里的问题可能归结为我糟糕的数据库结构,而不是我正在使用的SQL代码,但这是我想要实现的目标。
我有一个前端表单,要求用户选择一个位置。它看起来像这样(我在这里简化了它):
<form id="main-form" action="process.php" method="post">
<select id="location_selector" name="location">
<option value="serves_africa">Africa</option>
<option value="serves_aus_nz">Australia & New Zealand</option>
<option value="serves_europe">Europe</option>
<option value="serves_usa">United States</option>
</select>
</form>
然后我在我的公司&#39;中查找所选择的价值。数据库表返回公司名称。让我们说用户选择了澳大利亚&amp;新西兰&#39;。我的公司数据库表看起来像这样:
我的SQL看起来像这样:
SELECT company_name FROM `companies` WHERE `serves_aus_nz` = 1
到目前为止一切顺利。我现在想要为所选国家/地区返回友好名称,因此在process.php页面上我可以说类似
&#34;您选择了所有为澳大利亚和新西兰服务的公司。&#34;
但是如果我使用类似的东西来接受传递的值:
echo "You selected all companies serving " . $_POST["location"] . ".";
然后我会得到:
&#34;您选择了所有服务于serve_aus_nz&#34;
的公司所以,我想我可以创建第二个数据库表来转换不友好的国家/地区名称,例如&#39; serve_aus_nz&#39;进入友好的国家名称,如澳大利亚&amp; amp;新西兰&#34;。所以我创建了一个&#39;国家&#39;看起来像这样的表:
但现在我有点失落。我想我可以使用INNER JOIN来做到这一点。如下所示:
SELECT companies.company_name, countries.friendly_name
FROM companies
INNER JOIN countries ON = companies.serves_aus_nz = countries.unfriendly_name
WHERE `serves_aus_nz` = 1
但这不起作用。
正如我所说,感觉更像是我糟糕的数据库结构而不是SQL,但我可能错了。所以我真的很感激
a)可以使用现有数据库表的示例SQL查询
或
b)关于如何更好地构建数据库的建议
非常感谢您提供任何帮助或输入。
答案 0 :(得分:0)
您正在寻找经典的多对多关系(答案b):
https://dzone.com/articles/how-to-handle-a-many-to-many-relationship-in-datab
答案 1 :(得分:0)
看起来你有多对多的关系 您可以像这个例子一样解决当前的问题
SELECT c.company_name,
case when c.serves_africa = 0 then null
else (select ct.friendly_name from countries ct where ct.unfriendly_name = 'serves_africa')
end as Africa,
case when c.serves_aus_nz = 0 then null
else (select ct.friendly_name from countries ct where ct.unfriendly_name = 'serves_aus_nz')
end as AusNz,
case when c.serves_europe = 0 then null
else (select ct.friendly_name from countries ct where ct.unfriendly_name = 'serves_europe')
end as Europe,
case when c.serves_usa = 0 then null
else (select ct.friendly_name from countries ct where ct.unfriendly_name = 'serves_usa')
end as Usa
FROM companies c
答案 2 :(得分:0)
你的直觉是正确的,你的数据库的架构正在努力。如果您正确地规范化数据库,那么您将能够使用连接,因为您将不再具有多对多关系。我也有两个'hacky'解决方案:
SELECT company_name FROM companies WHERE serves_aus_nz = 1
SELECT friendly_name FROM countries WHERE unfriendly_name = 'serves_aus_nz'