Php 同一组联接表上的Mysql联合
所以,我很抱歉,如果之前出现过这种情况,但我找不到确切的答案 我试图从我的表中与另一个表连接的一组3列中获取一列ID 仅获取单个列的select语句如下所示:Php 同一组联接表上的Mysql联合,php,mysql,join,mysqli,union,Php,Mysql,Join,Mysqli,Union,所以,我很抱歉,如果之前出现过这种情况,但我找不到确切的答案 我试图从我的表中与另一个表连接的一组3列中获取一列ID 仅获取单个列的select语句如下所示: SELECT id FROM TableA JOIN TableB USING (key1, key2) WHERE someValue = X; 现在,据我所知,我可以通过工会来实现以下目标: SELECT spec_id1 AS id FROM TableA JOIN TableB USING (key1, key2) WHERE
SELECT id FROM TableA JOIN TableB USING (key1, key2) WHERE someValue = X;
现在,据我所知,我可以通过工会来实现以下目标:
SELECT spec_id1 AS id FROM TableA JOIN TableB USING (key1, key2) WHERE someValue1 = X
UNION
SELECT spec_id2 AS id FROM TableA JOIN TableB USING (key1, key2) WHERE someValue2 = Y
UNION
SELECT spec_id3 AS id FROM TableA JOIN TableB USING (key1, key2) WHERE someValue3 = Z
有没有一种方法可以使用(键1、键2)重用TableA连接TableB,这样就不会为每个选择连接它?我还有一个WHERE条件,适用于上面未显示的所有选择。我是否可以重复使用类似于:
FROM TableA JOIN TableB USING (key1, key2) WHERE someOtherValue = W
我正试图使用mysqli在PHP中实现这一点。我最初的直觉是使用临时表并查询它,但我不知道如何在mysqli中处理它。如果我可以将该表用于以下多个查询,这将是非常理想的,因为在连接的表中有额外的数据可以稍后使用
抱歉,如果这是天真的,但我不是一个真正的大网络开发人员。提前谢谢
编辑:
我正在寻找临时桌子,这似乎是一个好办法。在做任何事情之前,我还是想确认一下这是否是一个好主意。没有捷径,除非改变桌子的设计。您的方法是可靠的,您不应该担心在查询中有3个连接 如果已知3个规范ID列表没有任何重叠值,则可以通过将
UNION
更改为UNION ALL
来提高性能
在不更改总体
联合计划的情况下,一种可能的重写是将联接更改为存在的子查询:
SELECT spec_id1 AS id
FROM TableA
WHERE EXISTS
( SELECT *
FROM TableB
WHERE (TableB.key1, TableB.key2) = (TableA.key1, TableA.key2)
AND someValue1 = X
)
UNION --- or UNION ALL
...
UNION
...
或者-如果spec\u id
都包含在另一个BaseTable
中,您可以使用类似的方法,这可能会产生更好的执行计划:
SELECT id
FROM BaseTable
WHERE EXISTS
( SELECT * AS id
FROM TableA
JOIN TableB
USING (key1, key2)
WHERE someValue1
AND TableA.spec_id1 = BaseTable.id
)
OR EXISTS
(
...
)
OR ...
试试案例陈述。没有工会,你应该能做到
SELECT
CASE
WHEN someValue1 = X THEN spec_id1
WHEN someValue2 = Y THEN spec_id2
WHEN someValue3 = Z THEN spec_id3
END
AS id FROM TableA JOIN TableB USING (key1, key2)
WHERE
someValue1 = X OR someValue2 = Y OR WHERE someValue3 = Z
您可以尝试一个案例
声明:尽管我不确定这在您的情况下有多有用。我知道你想做什么,但是,一旦你把这些列组合在一起,你将如何判断哪些值来自哪个列?我不在乎它来自哪个列。为了给你一个更具体的例子来说明我在做什么,这3列类似于经理id、协调员id和主管id。每一列都是一个明显不同的角色,尽管看起来可能不是这样。我正在向他们发送一封类似的电子邮件,这只是一封普通管理类电子邮件。不管他们的确切位置如何,他们都会收到相同的电子邮件,所以尽管他们有3个不同的栏目是出于其他原因需要的,但他们都会收到相同的电子邮件。啊,明白了。是的,我建议使用带有组合的WHERE
子句的CASE
语句,如果你真的一心只想执行一个查询。如果3个列表中的每个列表中都有重叠的值,但3个列表之间没有重叠的值,那么使用UNION ALL执行SELECT DISTINCT或使用UNION执行SELECT(无DISTINCT或ALL)会更便宜吗?我想第一个但最好是(用你的数据)测试它。如果您可以使用UNION ALL
,那么您应该尝试分别优化这3个子查询。这是真的:-p出于某种原因,我总是尝试优化,然后再尝试。我不习惯web开发,因为在web开发中,大部分内容都可以立即进行测试