用于在第二个数据库表中搜索ambigous字段的SQL

时间:2018-03-15 11:30:33

标签: mysql sql database relational-database

我对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;。我的公司数据库表看起来像这样:

enter image description here

我的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;看起来像这样的表:

enter image description here

但现在我有点失落。我想我可以使用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)关于如何更好地构建数据库的建议

非常感谢您提供任何帮助或输入。

3 个答案:

答案 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'解决方案:

  • 您在创建原始SQL查询时知道不友好的名称,因此您只需发送两个查询:
    • SELECT company_name FROM companies WHERE serves_aus_nz = 1
    • SELECT friendly_name FROM countries WHERE unfriendly_name = 'serves_aus_nz'
  • 您可以将问题从数据库中移出并进入UI。
    • 用户在某个时刻输入一个选项,这样您就可以在代码中创建一个表格,将用户的输入转换为漂亮的名称。