使用3个表和联接

时间:2018-03-24 13:18:11

标签: mysql join

我之前在removing records from a table whose string was contained at the end of another record得到了一个很好的答案(谢谢@Paul Spiegel)。例如,删除' Farm'什么时候动物农场'存在)并按客户字段分组。

事实上,这个问题有点复杂,跨越了三个表格,我希望我可以轻松地扩展逻辑,但事实证明这对我来说也很具挑战性。我有三个表格,而不是一个包含ClientTerm的表格。

  1. 条款
  2. 客户
  3. 查找表(LUT),其中我存储了对的TermID和ClientID
  4. 自从我最初发布这个问题以来,我已经取得了一些进展,所以我的立场是Joins,结果Select返回我要从查找表(LUT)中删除的字段:

    http://sqlfiddle.com/#!9/479c72/45

    最终选择是:

    Select Distinct(C.Title),T2.Term From LUT L Inner Join Terms T On L.TermID=T.ID Inner Join Terms T2 On T.Term Like Concat('% ', T2.Term) Inner Join Clients C On C.ID=L.ClientID;

    我正在尝试将其变为Delete但收效甚微。

1 个答案:

答案 0 :(得分:0)

将此附加到您的查询中:

Inner Join LUT L2
On  L2.ClientID = L.ClientID
And L2.TermID  = T2.ID

这将确保客户确实匹配,您将得到以下结果:

| ClientID | TermID | ID |          Term | ID |      Term | ID | Title | ClientID | TermID |
|----------|--------|----|---------------|----|-----------|----|-------|----------|--------|
|        1 |      2 |  2 |     Small Dog |  1 |       Dog |  1 |   Bob |        1 |      1 |
|        2 |      5 |  5 | Big Black Dog |  3 | Black Dog |  2 | Alice |        2 |      3 |

要从LUT表中删除相应的行,请将Select *替换为Delete L2

但删除条款更棘手。由于它是多对多关系,因此该术语可能属于多个客户端。所以你不能只删除它们。您需要在第二个语句中清理表。这可以通过以下声明来完成:

Delete T
From Terms T
Left Join LUT L
On L.TermID = T.ID
Where L.TermID Is Null

演示:http://sqlfiddle.com/#!9/b17659/1

请注意,在这种情况下,术语Medium Dog也将被删除,因为它不属于任何客户端。