首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mysql查询/子查询

Mysql查询/子查询
EN

Stack Overflow用户
提问于 2014-08-27 06:04:21
回答 2查看 83关注 0票数 3

我正在尝试使现有的数据库和系统符合我们现在从制造商那里收到的数据。它的格式不能/不会改变。它是一个表,其中包含来自单个制造商的产品编号(item_id),并交叉参考来自多个制造商(oem_code)的零件。

表:外部参照

代码语言:javascript
运行
复制
item_id   | oem_code
   A      |    123
   A      |    234
   B      |    234
   B      |    345
   C      |    456  

表:部件(仅显示相关partNum列)

代码语言:javascript
运行
复制
partNum  
  S.A  
  S.B  
  S.C  
  123  
  234  
  345  
  456  

两个外部参照列都包含零件表中的零件代号。我需要输入零件代号($fielddata),然后从parts.partNum = $fielddata所在的零件中检索所有数据,以及从外部参照中检索与parts.partNum匹配的所有交叉引用编号。不幸的是,制造商的部件号有S。在我们的系统中排在它们之前,但不在它们发送的表中。如果没有S我们的系统将无法识别它们。

MySQL查询为

代码语言:javascript
运行
复制
SELECT * 
FROM parts
WHERE partNum
IN (    
    SELECT oem_code
    FROM xref
    WHERE item_id = ( 
        SELECT item_id
        FROM xref 
        WHERE oem_code = '$fielddata' 
    )
)

123返回来自parts.partNum = 123,234的部分的所有数据(还需要S.A)

234错误输出,#1242 -子查询返回超过1行(需要234,S.A,S.B)

A不返回任何内容(需要123、234、S.A)

S.A也不返回任何内容(需要123、234、S.A)

我知道我的sql语句和子查询的局限性,以及为什么我得不到所需的完整结果集,但我不知道如何扩展它以获得我想要的结果。我很高兴能用它走得这么远。当我试图扩展它时,我得到了不想要的结果或错误,所以我几乎是在我的能力的尽头。

我也意识到运行子查询在大型数据库上效率不高。因此,我准备完全重写sql,或者修改到目前为止所获得的内容。外部参照有>27k行,零件有10列的>550k行(如果有人关心的话)。

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2014-08-27 06:38:03

使用exists的查询

代码语言:javascript
运行
复制
SELECT *
FROM parts
WHERE EXISTS (
    SELECT 1 FROM xref x1
    JOIN xref x2 ON x1.item_id = x2.item_id
    WHERE (x2.oem_code = '$fielddata' OR x2.item_id = RIGHT('$fielddata',1))
    AND (x1.oem_code = partNum OR CONCAT('S.',x1.item_id) = partNum)
)

更新

对给定$fielddata的派生表进行联接可能会更快。这本质上是@JohnRuddell的查询,但修改为使用派生表。

代码语言:javascript
运行
复制
SELECT p.* FROM parts p
JOIN (
    SELECT x.oem_code partNum
        FROM xref x
        JOIN xref x1 
          ON x1.item_id = x.item_id 
         AND x1.oem_code = '$fielddata'
          OR x.item_id = RIGHT('$fielddata', 1)
    UNION
    SELECT CONCAT('S.', x.item_id) partNum
        FROM xref x
        WHERE x.oem_code = '$fieldata' 
           OR x.item_id = RIGHT('$fielddata', 1)
) t1 ON t1.partNum = p.partNum
票数 2
EN

Stack Overflow用户

发布于 2014-08-27 06:15:12

我认为这应该能做你想要的

代码语言:javascript
运行
复制
SELECT * 
FROM parts
WHERE partNum IN 
(   SELECT x.oem_code
    FROM xref x
    JOIN xref x1 
      ON x1.item_id = x.item_id 
     AND x1.oem_code = '$fielddata'
      OR x.item_id = RIGHT('$fielddata', 1)
)
OR partNum IN 
(   SELECT CONCAT('S.', x.item_id)
    FROM xref x
    WHERE x.oem_code = '$fieldata' 
       OR x.item_id = RIGHT('$fielddata', 1)
)

DEMO

只需使用连接,这样就不会执行第三个子查询

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25515906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档