Php 同一组联接表上的Mysql联合

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

所以,我很抱歉,如果之前出现过这种情况,但我找不到确切的答案

我试图从我的表中与另一个表连接的一组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 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开发中,大部分内容都可以立即进行测试