相关名称蜘蛛网

Dar*_*ill 4 mysql database-design

例如,说我的表中有以下条目:

ID - 1
Name - Daryl
  
ID - 2 
Name - Terry

ID - 3
Name - Dave

ID - 4
Name - Mitch
Run Code Online (Sandbox Code Playgroud)

我最终希望在我的表中搜索一个特定名称,但显示所有关联的名称。例如,

搜索 Daryl 将返回 Terry、Dave 和 Daryl。

搜索特里将返回戴夫、达里尔和特里

搜索米奇只会返回米奇。

当前包含名称的表如下:

--
-- Table structure for table `members`
--

CREATE TABLE `members` (
  `ID` int(255) NOT NULL,
  `GuildID` int(255) NOT NULL,
  `ToonName` varchar(255) NOT NULL,
  `AddedOn` date NOT NULL,
  `AddedByID` int(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `members`
--

INSERT INTO `members` (`ID`, `GuildID`, `ToonName`, `AddedOn`, `AddedByID`) VALUES
(1, 1, 'Daryl', '2020-01-17', 5),
(2, 1, 'Terry', '2020-01-17', 5),
(3, 1, 'Mitch', '2020-01-17', 5),
(4, 1, 'Dave', '2020-01-17', 5);

--
Run Code Online (Sandbox Code Playgroud)

以供参考。GuildID 将是基于搜索者登录详细信息的默认搜索条件。有了这样的蜘蛛网,我将如何创建另一个表(或另一个列)以根据搜索条件创建组合搜索蜘蛛网结构?

我在想一些事情:

CREATE TABLE `Associated`(
    `ID` INT(255) NOT NULL,
    `MainID` INT(255) NOT NULL,
    `SecondaryID` INT(255) NOT NULL,

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `Associated` (`ID`, `MainID`, `SecondaryID`) VALUES

(1, 1, 2) -- Daryl Associated With Terry
(2, 1, 4) -- Daryl Associated With Dave
Run Code Online (Sandbox Code Playgroud)

但我觉得这会产生一个过于复杂的价值结构,有很多冗余输入。有没有更有效的方法来创建统一搜索?

整个操作的想法是每个名称都是个人。所以某些条目可以放在 Daryl 下,Terry 单独行动。但是,一次搜索将通过搜索一个名称将所有关联的名称汇集在一起​​,然后根据别名将总条目汇总在一起?

Pun*_*jar 9

你可以试试这个

Select IFNULL(m.ToonName , members.ToonName) as ToonName 
from members 
LEFT JOIN Associated on Associated.MainID = members.ID 
LEFT JOIN members as m on m.ID = Associated.SecondaryID 
Where members.ToonName = "Mitch"
Run Code Online (Sandbox Code Playgroud)

当您在关联表中有“米奇”条目时,它会返回您达里尔,当您没有关联 Id 时,它将返回成员表中的名称。

如果你用“Daryl”检查这个,它会给你两个结果,

Select IFNULL(m.ToonName , members.ToonName) as ToonName 
from members 
LEFT JOIN Associated on Associated.MainID = members.ID 
LEFT JOIN members as m on m.ID = Associated.SecondaryID 
Where members.ToonName = "Daryl"
Run Code Online (Sandbox Code Playgroud)

如果您希望将所有名称都放在一个列中,您可以将其GROUP_CONCAT用作另一个答案中建议的 @flash。