【问题标题】:MySQL SELECT in SELECT-clause or in WHERE-clause in order to filter furtherMySQL SELECT 在 SELECT 子句或 WHERE 子句中,以便进一步过滤
【发布时间】:2021-12-22 22:58:24
【问题描述】:

我正在尝试过滤一些数据,但由于数据来自数据库中的 2 个表,我必须将它们合并在一起,允许来自第二个表的空值,因为我总是需要在第一个表中提供任何值,由于这是一个产品数据库,其中一些产品具有子组合,而有些则没有。到目前为止,我已经想出使用 Union 将两个表连接在一起,但现在我需要一种方法来使用 WHERE 子句过滤掉数据;但是:这是我卡住的地方。我尝试将联合作为 FROM 子句中的 select 语句:没有返回数据,我尝试将其作为子句放入 SELECT 子句中:没有返回数据...

简而言之,我需要这样的东西:

SELECT id_product, id_product_attribute,upc1,upc2 
FROM (UNION) 
WHERE upc1='xyz' OR upc2='xyz';

例如,结果可能是这样的:

-> 100, null, 9912456, null

-> 200, 153, 9915559, 9977123

目前我有这个(抱歉我没有更多):

(SELECT     product.id_product as id_product, 
            product.upc as upc1, 
            comb.id_product_attribute, 
            comb.upc as upc2
 FROM   `db`.table1 product
   LEFT JOIN `db`.table2 comb
   ON comb.id_product = product.id_product
)
UNION
(SELECT     product.id_product as id_product, 
            product.upc as headCNK, 
            comb.id_product_attribute, 
            comb.upc
 FROM   `db`.table1 product
   RIGHT JOIN `db`.table2 comb
   ON comb.id_product = product.id_product
);

还要注意 upc1 来自表 1,upc2 来自表 2。

我可以使用整个查询,并在最坏的情况下使用一些业务逻辑过滤掉所有内容,但不是因为我不想在我不需要的地方执行无休止的查询,我的服务提供商不会'不喜欢……

更新: 我也试过了:

SELECT * 
from db.t1 as prod 
CROSS JOIN db.t2 as comb ON prod.id_product = comb.id_product 
WHERE prod.upc = 'xyz' OR comb.upc = 'xyz'; 

这也没有用。


在这里放了一些小样本数据: http://sqlfiddle.com/#!9/340d7d

查询 SELECT id_product, id_product_attribute, table1.upc, table2.upc 的 where 子句中使用的 '991002' 的输出应该是:101, null, 991002, null

对于“990001”,它应该是:101、201、990001、990001

【问题讨论】:

  • 提供样本小提琴(或 CREATE TABLE + INSERT INTO 数据)和该数据所需的输出以及详细解释。
  • @Akina 修复了评论;试图看看我能提供什么数据。但我认为这个例子很简单;它基本上是一个带有 where 子句的完全连接;但我无法让它工作......没有足够的练习:(
  • 我也试过 CROSS JOIN 和 ON 子句?不合逻辑。使用 INNER JOIN。
  • @Akina Innerjoin 是不够的,因为我需要所有可能的行,而不仅仅是表上相互匹配的行。

标签: mysql select union


【解决方案1】:

尝试所有值

SELECT t1.id_product, t2.id_product_attribute, t1.upc, t2.upc
FROM ( SELECT upc FROM table1
       UNION 
       SELECT upc FROM table2 ) t0
LEFT JOIN table1 t1 USING (upc)
LEFT JOIN table2 t2 USING (upc)

对于确定的upc值编辑为

...
SELECT t1.id_product, t2.id_product_attribute, t1.upc, t2.upc
FROM ( SELECT 990001 upc ) t0
LEFT JOIN table1 t1 USING (upc)
LEFT JOIN table2 t2 USING (upc)
...

【讨论】:

  • 对第二个查询做了一个小的编辑(必须确保我从两个表中都获得了产品 ID 的值,因为我总是需要这个......为网站构建新的重定向。现在它正在按我希望的那样工作!谢谢!感谢笔记并以您的方式发送良好的共鸣。
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多