Select 多个值(或不)到具有关系表的 pascal 字段 mysql (mariadb)

Select multiple values (or not) to pascal fields with relational tables mysql (mariadb)

抱歉再问一个问题,但我对数据库不是很擅长。

我正在 Lazarus 上开发一个小应用程序(Delphi 类似),我的应用程序只是几个 SQL 语句,在我的数据库中我有类似的结构 phone 存储.

tblUser uid uname udateofbirth uaddress

tblPhoneNumber pid uid ptype pnumber

tblPhoneRelation uid pid

我需要知道的是,当我使用 phone 进行查询时,SQL 是否可以提供某种列表,这样我就可以在某些字段中拆分该列表。

使用另一个问题的这段代码,我可以检索 phone 类型的每种类型的 'max' 数字,但关键是我可以有多个相同类型的数字,例如 2 个单元格 phone 号码,或 3 个家庭号码。

SELECT u.uname AS Name, u.udateofbirth AS 'Date of B.', 
   MAX(CASE WHEN p.ptype = 1 THEN p.pnumber END) AS 'Cell phone',
   MAX(CASE WHEN p.ptype = 2 THEN p.pnumber END) AS 'Home phone', 
   MAX(CASE WHEN p.ptype = 3 THEN p.pnumber END) AS 'Commercial phone',  
   MAX(CASE WHEN p.ptype = 4 THEN p.pnumber END) AS 'Message phone' 
FROM tblUser AS u 
   JOIN phonerelation ON u.uid = phonerelation.uid 
   JOIN tblPhoneNumber AS p ON p.pid = phonerelation.pid
GROUP BY 1, 2 

在 SQL 中有任何想法或需要在 Lazarus 中创建一个暂时的代码来一次检索每种 phone?比如:尝试找到单元格 phones ... 如果单元格 phone 计数小于 4 尝试找到家 phone... 直到我得到一些结果。

感谢您的帮助。

如果您在 "owning" 实体(例如人)和任意多个其他类型的实体(例如 phone 数字)之间存在关系,请执行 not 尝试将其他实体放在拥有实体的字段中。

相反,拥有实体在一个 table 中,拥有的实体在单独的 table 中,通过拥有实体的 ID 链接到它。这样你就可以根据需要拥有尽可能多的拥有实体,每个人或任何东西。

在 Delphi(和 Lazarus)中,您将这样的一对多关系建模为数据集之间的 "Master-Detail" 关系。您需要阅读 Delphi 中有关 M-D 建模的任何在线教程。

希望这能给你一些想法:

SELECT u.uname AS Name, u.udateofbirth AS 'Date of B.', 
   p1.pnumber AS 'Cell phone',
   p2.pnumber AS 'Home phone', 
   ...
FROM tblUser AS u
   LEFT JOIN (
      select pnumber, uid 
      from phonerelation JOIN 
        tblPhoneNumber AS p ON p.pid = phonerelation.pid WHERE p.ptype = 1) p1
      ON u.uid = p1.uid
   LEFT JOIN (
      select pnumber, uid 
      from phonerelation JOIN 
        tblPhoneNumber AS p ON p.pid = phonerelation.pid WHERE p.ptype = 2) p2
      ON u.uid = p2.uid
   ...
-- Grouping is not needed here