好的,我正在尝试学习执行搜索的最佳方法。 我有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)的日期列表,没有重复。
答案 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次。