SQL搜索没有重复

时间:2018-11-04 14:57:52

标签: mysql sql

好的,我正在尝试学习执行搜索的最佳方法。 我有40张桌子。在40个表格中,所有表格的ID和日期都在同一列中,其中2列;所有表显然都有其他不匹配的列。 现在,并不是每个表都被用户使用。一个用户可以使用5个表,它们可以全部使用40个表。这些ID也可以附加多个日期。我想从一个ID中获取所有40个表中的所有日期,没有重复。如果表1和表10的日期相同,那么我也只需要1次。

所以在这里我有一些问题。

我读过的第一种方法是

 $stmt = $this->con->prepare("SELECT date FROM table1 
 left join table2 on table1.id = table2.id
 left joins for table2--->table40
 WHERE ID = ?
 GROUP BY date");

我所看到的第二种方式就是这样。

 $stmt = $this->con->prepare("SELECT Distinct date FROM table1 
 left join table2 on table1.id = table2.id
 left joins for table2--->table40
 WHERE ID = ?");

我读过的第三种方法是这个。 (他们的话不是我的) “根据我的经验(此后受到限制),我为此目的使用了等值联接查询。让我向您展示一个示例。

请考虑三个名为Table1,Table2和Table3的表,并使用一个名为Code(已转换为ID)的公用列。下面的代码片段将这三个表连接在一起,没有重复:“

 select date from Table1, Table2, Table3..... where Table1.ID=Table2.ID=Table3.ID......;

现在我的问题是我进行此搜索的正确方法是什么?

它应该返回找到1个ID(正在搜索的ID)的日期列表,没有重复。

1 个答案:

答案 0 :(得分:2)

您的第一种和第三种方法仅在语法上有所不同(第一种方法具有正确的语法,而第三种方法使用的是过去15年来不用于任何新开发的古老语法)。

这三种方法都遇到相同的问题:Table1没有目标ID时,其他表中该ID的存在与否无关紧要:除非{{ 1}}具有目标ID。

您可以通过对单个选择使用Table1来解决此问题,如下所示:

UNION

这将产生所有SELECT date FROM ( SELECT date FROM Table1 WHERE Id=? UNION SELECT date FROM Table2 WHERE Id=? UNIO SELECT date FROM Table3 WHERE Id=? UNION ... UNION SELECT date FROM Table40 WHERE Id=? ) AS x 值,而不管它在哪个表中找到。

注意:该方法的不幸副作用是,由于JDBC不支持命名参数,因此需要将date参数绑定40次。