【问题标题】:PHP/MYSQL : Left Join not getting proper parent detailsPHP/MYSQL:左连接没有得到正确的父级详细信息
【发布时间】:2015-01-02 10:43:32
【问题描述】:
SELECT smirt.id as mid,
pc.packet_name as pname, 
pcs.packet_name as mainn, 
smirt.p_status as st , 
smirt.new_value as weight , 
smirt.packet_id, 
smirt.parent_packet_id 
FROM issue_receive_process AS smirt 
LEFT JOIN packet_creation AS pc ON  pc.id = smirt.packet_id
LEFT JOIN packet_creation AS pcs ON pcs.id = pc.parent_packet_id 
WHERE smirt.type = 53
AND smirt.main_kapan_id IN(1,2) 
ORDER BY smirt.packet_id

从上面的查询我得到以下详细信息:

但是上面是错误的

因为 pname 是我的子包 mainn 是我的主数据包

实际上我需要(应该是)pname(NULL,0004)和mainn(0003,0002)如下(下图是编辑图像):

因为 0003 , 0002 是主包, 0004 是 0002 的子包 ... 0003 没有任何子包 ....

如果我错了,有什么可以帮助我的。

谢谢

更新:父表图像(issue_receive_process AS smirt)

根据用户:KISHORE BELOW QUERY:

SELECT smirt.id
,smirt.packet_id
,smirt.main_kapan_id
,pc.id
,pc.packet_name
,pc.parent_packet_id 
FROM issue_receive_process AS smirt 
LEFT JOIN packet_creation AS pc ON  pc.id = smirt.packet_id
WHERE pc.packet_name IN ('0002','0003','0004') 
ORDER BY smirt.packet_id

结果如下:

第二次更新表: packet_creation 下面的详细信息按照以下查询

SELECT *
FROM `packet_creation`
WHERE `id`
IN ( 5, 11, 9 )
LIMIT 0 , 30

【问题讨论】:

  • 您能否也发布 packet_creation 表的匹配数据。至少足以重现问题。
  • 先生,packet_creation 表中有很多数据 ..ok 让我看看 ..谢谢回复 ..会试着把它放在这里 min
  • 查看测试数据,对于中间为 4 的记录,packet_id 为 5。 Packet_id 5 的数据包名称为“0003”(因此 pname 为“0003”),父数据包 id 为0. 但是,对于 id 为 0,packet_creation 上没有记录,因此没有匹配的父数据包,因此 mainn 为空。基于此,您获得的结果对于您拥有的数据是正确的。
  • 先生,从顶部...第一张图片是错误的..第二张图片是我想要的(我已经在编辑中显示了).... 0003 和 0002 与 parent_packet_id 为 0 .. 其中0004 的父数据包 ID 为 9 ...因此 0002 是主数据包,而 0004 是子数据包 .. 属于 0002 ....所以最终输出应该是 pname: (NULL,0004) ,其中包含子数据包详细信息 ..where mainn : (0003,0002) 这是 mainpacket..但我得到的是来自前 1 个磨损的图像
  • 简而言之,我需要如下: mainpacket : subpacket ---- (0003,0002) : (NULL,0004)... 因此 0003,0002 是主数据包,而 0004 是 0002 的子数据包。 .. 0003(主数据包)没有任何子数据包,因此它为 NULL ..... 但我得到的是 (NULL ,0002) : (0003,0004) 这是错误的......因为 0003 是我的主数据包应该是 (0003,0002) : (NULL,0004),....希望你理解

标签: php mysql join left-join


【解决方案1】:

我对你想要什么感到很困惑。

当您使用测试数据运行时,您拥有的 SQL 将给出您描述为错误的数据。它正在获取一条记录和与之配套的数据包,然后是该数据包的父级。如果数据包没有父数据包,则(并且应该)返回 NULL。

我认为您唯一想要的是,如果没有父记录,那么您希望子数据包 id 作为父数据包 id 返回,而子数据包 id 返回为 NULL。

如果是这样的话:-

SELECT smirt.id as mid,
        IF(pcs.packet_name IS NULL, NULL, pc.packet_name) as pname, 
        IF(pcs.packet_name IS NULL, pc.packet_name, pcs.packet_name) as mainn, 
        smirt.p_status as st , 
        smirt.new_value as weight , 
        smirt.packet_id, 
        smirt.parent_packet_id 
FROM issue_receive_process AS smirt 
LEFT JOIN packet_creation AS pc ON  pc.id = smirt.packet_id
LEFT JOIN packet_creation AS pcs ON pcs.id = pc.parent_packet_id 
WHERE smirt.type = 53
AND smirt.main_kapan_id IN(1,2) 
ORDER BY smirt.packet_id

根据上述查询结果如下:

因此我得到的最终输出是 3,4,2 但应该是 0003,0002,0004

编辑 - 将字段转换为 char 以尝试强制前导零:-

SELECT smirt.id as mid,
        IF(pcs.packet_name IS NULL, NULL, CAST(pc.packet_name AS CHAR)) as pname, 
        IF(pcs.packet_name IS NULL, CAST(pc.packet_name AS CHAR), CAST(pcs.packet_name AS CHAR)) as mainn, 
        smirt.p_status as st , 
        smirt.new_value as weight , 
        smirt.packet_id, 
        smirt.parent_packet_id 
FROM issue_receive_process AS smirt 
LEFT JOIN packet_creation AS pc ON  pc.id = smirt.packet_id
LEFT JOIN packet_creation AS pcs ON pcs.id = pc.parent_packet_id 
WHERE smirt.type = 53
AND smirt.main_kapan_id IN(1,2) 
ORDER BY smirt.packet_id

【讨论】:

  • 可能是你的权利,向我解释它有点令人困惑:..先生,我得到的是pname:mainn =(0003,0004):(NULL,0002)..其中pname是子数据包(多数民众赞成在子类别)和 mainn 是主数据包(即主要类别)...但实际上 0003 是主数据包,应该显示在 mainn 列中,但它显示在 pname(子数据包)列表中 ..因此 0003 是主数据包.. .我应该得到pname(子包)的结果:mainn(主包)=(null,0004):(0003,0002)..,我没有得到:(
  • 先生,我已将查询图像放入您的答案中.. 我也从您的查询上方得到了我想要的.. 但我得到的结果是 3,4,2 但应该是 0003,0004, 0002 ..我的零消失了:(现在..请帮助我...还请在简单的管理器中向我解释什么是错误的,我错过了..这样我就可以在所有其他页面中更改相同的内容:) 谢谢支持到现在..只有 0002,0003 然后它被标记为已解决:)
  • 先生,您在那儿...现在只有 000 个丢失...如何通过您的查询找回它
  • 不确定那里发生了什么,因为当我尝试得到前导零时。您可以尝试在查询中将字段转换为 CHAR(我正在为此添加建议的代码)。
  • 完成 :)...感谢您的大力支持 :) 再次感谢
猜你喜欢
  • 2018-11-06
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 2018-05-30
  • 2015-03-30
  • 1970-01-01
相关资源
最近更新 更多