Join 如何在UNION和LEFT中连接WHERE子句?

Join 如何在UNION和LEFT中连接WHERE子句?,join,mariadb,union,Join,Mariadb,Union,我试图在4个表上执行一个联合,以从每个表中获取ID,其中用户ID=$\u会话['uid'] 我会解释每一个问题,让你知道我从哪里来,我要去哪里。 第一个查询工作正常,问题是:只有每条记录的ID。我需要左连接以获得每个记录对应的数据 SELECT DISTINCT(bid_id) FROM bids_questions UNION SELECT DISTINCT(bid_id) FROM bids_qualify_requests WHERE type = 'Prequalified' UNION

我试图在4个表上执行一个
联合
,以从每个表中获取ID,其中用户ID=
$\u会话['uid']

我会解释每一个问题,让你知道我从哪里来,我要去哪里。 第一个查询工作正常,问题是:只有每条记录的
ID
。我需要左连接以获得每个记录对应的数据

SELECT DISTINCT(bid_id) FROM bids_questions
UNION SELECT DISTINCT(bid_id) FROM bids_qualify_requests WHERE type = 'Prequalified'
UNION SELECT DISTINCT(bid_id) FROM bids_documents_download
UNION SELECT DISTINCT(bid_id) FROM bids_documents_upload
WHERE uid=? GROUP BY bid_id

$stmt->bind_param('i', $_SESSION['uid']);
在第二次尝试中,我添加了一个左连接。此查询工作正常,但缺少指定用户ID的
WHERE
子句

SELECT 
bid_id.bid_id,//BID ID's  
b.title,
u.name
FROM (
SELECT DISTINCT(bid_id) FROM bids_questions
UNION SELECT DISTINCT(bid_id) FROM bids_qualify_requests WHERE type = 'Prequalified'
UNION SELECT DISTINCT(bid_id) FROM bids_documents_download
UNION SELECT DISTINCT(bid_id) FROM bids_documents_upload
) AS bid_id
LEFT JOIN bids b ON b.bid_id = bid_id.bid_id
LEFT JOIN users u on b.uid = u.uid
GROUP BY bid_id
如果我试图在其中添加
WHERE
子句,我会收到一个错误,说明该列不存在。

SELECT 
bid_id.bid_id,//BID ID's  
b.title,
u.name
FROM (
SELECT DISTINCT(bid_id) FROM bids_questions
UNION SELECT DISTINCT(bid_id) FROM bids_qualify_requests WHERE type = 'Prequalified'
UNION SELECT DISTINCT(bid_id) FROM bids_documents_download
UNION SELECT DISTINCT(bid_id) FROM bids_documents_upload
) AS bid_id
LEFT JOIN bids b ON b.bid_id = bid_id.bid_id
LEFT JOIN users u on b.uid = u.uid
WHERE bid_id.uid=?
GROUP BY bid_id

$stmt->bind_param('i', $_SESSION['uid']);

有没有办法添加适用于每个内部查询的
WHERE
子句?我确信我可以在每个查询中添加一个单独的
,其中
,并为每个查询绑定一个参数。或者我从所有表中选择UID和bid_id,然后只从该表中选择UID?我想要最佳性能选项,因为这个数据库将相当大。有什么想法吗?

在您的第一次尝试中,
WHERE
条款只在所有工会的最终
SELECT
上生效。。。i、 e.只有在:

SELECT DISTINCT(bid_id) FROM bids_documents_upload WHERE uid=? GROUP BY bid_id
在这种情况下,
groupby
也是多余的,因为
DISTINCT
关键字也会做同样的事情

在第二次尝试中-您的内部查询可以独立运行,因此如果
WHERE
子句在
UNION
上有效,那么它可以位于括号内。您尚未说明在何处添加了
where
子句以获取您报告的错误消息。如果它在内部选择之外,那么它当然不会;t不存在,因为您仅从UNION语句返回
bid\u id
——不包含“uid”

您需要扩展所提供的信息-至少是
联合
s中涉及的每个表的模式,因为这将驱动内部查询在将其连接回
bids
表以及
用户
表之前所需的内容

在处理单个
uid
时,最好在
users
表上执行单个查找,以提取
uid
名称并将其存储在变量中,而不是加入到表中


如果您添加了其他信息,那么您可能会更成功地获得解决方案。

什么mysql版本?为什么对用户使用左连接?用户中的行有时不存在吗?用户行始终存在,因为用户必须发布出价。将您的WHERE添加到每个子查询(4次)。这将比联合所有行然后应用于组合行集的位置更快。当然您想要的是
u.uid=?
,而不是
bid\u id.uid=?
?Distinct不是一个函数,它会删除整个重复行,后面的括号不起任何作用,是子查询中的唯一列,它是4个查询的联合,是bid_id。将代码切分为第一个子表达式,该子表达式不返回您期望的内容,说出您期望的内容&为什么,并通过引用权威文档进行证明。当你不知道这些部分是如何工作的时候,不要试图解决你的总体目标。对于代码问题,请给出一个示例。通过编辑而不是评论来澄清。在每篇文章中问1个具体的非重复问题。除非你定义它,否则没有“最优”。我只是更新了这个问题来演示插入where子句