Mysql SQL如何根据列值选择列

Mysql SQL如何根据列值选择列,mysql,join,Mysql,Join,我希望能够根据另一列中的值选择一列。举一个简单的例子: 从 及 我想输出: Name Due A 70 B 90 C 110 要连接前两个表,只需突出显示需要从另一个表中的值中选择一列。 我存储数据的选择可能不正确。有什么想法吗?您的数据存储选择很好,不过最好在每个表中都有id值,并将人员表链接到duesid值上的dues表,而不是名称。根据您的结构,您可以通过一个简单的连接获得想要的结果: SELECT p.Name ,

我希望能够根据另一列中的值选择一列。举一个简单的例子: 从

我想输出:

 Name  Due         
 A     70     
 B     90
 C     110
要连接前两个表,只需突出显示需要从另一个表中的值中选择一列。
我存储数据的选择可能不正确。有什么想法吗?

您的数据存储选择很好,不过最好在每个表中都有
id
值,并将人员表链接到dues
id
值上的dues表,而不是名称。根据您的结构,您可以通过一个简单的
连接
获得想要的结果:

SELECT p.Name
     , CASE WHEN p.Status = 'Full' THEN d.Full ELSE d.Discounted END AS Due
FROM people p
JOIN dues d ON d.Sport = p.Activities
输出:

Name    Due
A       70
B       90
C       110

问题是您的数据没有标准化,这使得查询更加困难。一种方法是规范化数据。实现这一点的一种方法是在派生表中;另一种方法是构造表,使其规范化

由于status和sport的组合产生了一个速率,因此数据没有标准化,因为您有两个rates列

SELECT Name, Due
FROM A
INNER JOIN (SELECT Sport, 'Full' as Status, Full as Due FROM B UNION ALL
            SELECT Sport, 'Discounted' as Status, Discounted as Due FROM B) B
 on A.Activities = B.Sport
and A.Status = B.Status
而不是像这样的表格:

Sport      Full   Discounted
Tennis      70    60
Badminton   110   90
这是标准化的,因为您可以添加运动/费率类型和不改变结构的新费率。如果您需要在先前的格式中添加一个新的费率类型,那么您需要添加一个表

Sport      RateType      Rate
Tennis     Full          70
Tennis     Discounted    60
Badminton  Full          110
Badminton  Discounted    90
通过这种方式,您可以添加运动和不同的费率,而无需更改代码

Tennis     Weekend    20
Complete   Family     575

从技术上讲,您应该有一个RateType表,其中列出了费率名称和ID,这样您就可以拥有所有可用费率类型的完整列表,然后可以根据需要与每个运动项目和$rate绑定。您还可以显示费率类型已折旧的时间,以便不能选择新的费率类型,但允许现有的费率类型保持不变

您将此问题标记为PHP,但没有PHP代码。你能和我们分享一下你在PHP中的尝试吗。这将帮助我们确定你做错了什么。请阅读并点击谷歌的“stackexchange家庭作业”&--展示你已经尝试和考虑了什么,以及你可以做什么。这也是一个常见问题。我一直在寻找一个解决方案,其中添加不同的价格将更容易(特别是如果有很多价格),但这将做的把戏@SimonLang您需要进一步规范化您的数据以实现这一目标,拥有一个包含
Sport
Status
Price
列的表格;然后您可以在
Sport
Status
JOIN
获取价格。如果你打算扩展到很多价格,这将是一个更好的方法。你所说的表格结构是什么意思?在表格中填写完整和折扣类型以及费率栏。状态或费率类型与现有的概念相同。如果出现溢价、假日、客人或。。。当然,费率需要以后再加!非常感谢您明确表示:)
Sport      RateType      Rate
Tennis     Full          70
Tennis     Discounted    60
Badminton  Full          110
Badminton  Discounted    90
Tennis     Weekend    20
Complete   Family     575