首页 / PHP / php-具有父代码的多列引用
php-具有父代码的多列引用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php-具有父代码的多列引用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5241字,纯文字阅读大概需要8分钟。
内容图文
![php-具有父代码的多列引用](/upload/InfoBanner/zyjiaocheng/658/c611f953f00441369b19b93b92879125.jpg)
我想知道如何从TBL_ITEM引用三列以从TBL_INVTY获取SUM(QTY).
TBL_ITEM
+------+-------------+----------+
| CODE | PARENT_CODE | OLD_CODE |
+------+-------------+----------+
| 2 | NULL | 20 |
| 2A | 2 | NULL |
| 2B | 2 | NULL |
| 3 | NULL | NULL |
| 4 | NULL | NULL |
| 20 | NULL | NULL |
+------+-------------+----------+
TBL_INVTY
+------+-----+
| CODE | QTY |
+------+-----+
| 2 | 2 |
| 2A | 4 |
| 2B | 1 |
| 3 | 3 |
| 4 | 5 |
| 20 | 2 |
+------+-----+
并且,到达此:
+------+-----+
| CODE | QTY |
+------+-----+
| 2 | 9 |
| 3 | 3 |
| 4 | 5 |
+------+-----+
最后一个表WHERE CODE = 2上的第一行的QTY为9,因为相对于TBL_ITEM中的引用,我从TBL_INVTY WHERE CODE IN(20,2A,2B,2)中获取了SUM(QTY).
解决方法:
诀窍是从tbl_item获得两列结果集.我将这两列称为“匹配”和“地图”. “匹配”列中的值是我们将在JOIN谓词中使用的值,以查找“匹配”行.但是我们将要从map列返回值,并对此进行GROUP BY.
对于您的示例,我认为此查询为我们提供了所需的结果集:
SELECT IF(i.old_code IS NOT NULL,i.old_code,i.code) AS `match`
, IF(i.parent_code IS NOT NULL,i.parent_code,i.code) AS map
FROM tbl_item i
LEFT
JOIN tbl_item j
ON j.old_code = i.code
WHERE j.old_code IS NULL
UNION ALL
SELECT k.code
, k.code
FROM tbl_item k
WHERE k.old_code IS NOT NULL
这应该给这个结果集:
+-------+-------+
| match | map |
+-------+-------+
| 20 | 2 |
| 2A | 2 |
| 2B | 2 |
| 3 | 3 |
| 4 | 4 |
| 2 | 2 |
+-------+-------+
我们需要确保“匹配”列是唯一的,以便我们不会无意中将tbl_invty中的一行与该集合中的多行进行匹配.在这组数据中这不是问题,但在更一般的情况下可能是这样.同样,这只会将旧到新“级别”化.如果以后会替换“新”代码,则此查询将找不到“最新”代码,只会找到该行中的值.同样,此数据不是问题,但更一般的情况可能是一个问题.
(还有其他写查询的方法,例如使用CASE表达式而不是IF,或更简洁:
SELECT IFNULL(i.old_code,i.code) AS `match`
, IFNULL(i.parent_code,i.code) AS map
FROM tbl_item i
LEFT
JOIN tbl_item j
ON j.old_code = i.code
WHERE j.old_code IS NULL
UNION ALL
SELECT k.code
, k.code
FROM tbl_item k
WHERE k.old_code IS NOT NULL
无论如何,一旦我们有一个查询可以为我们提供合适的结果集,就可以轻松实现SUM(QTY).我们只是将该查询用作另一个查询中的行源. (我们将其称为“内联视图”,尽管MySQL称其为“派生表”,它更准确地描述了MySQL实际上是如何处理视图查询的.)
SELECT m.map AS CODE
, SUM(v.qty) AS QTY
FROM tbl_invty v
JOIN (
SELECT IFNULL(i.old_code,i.code) AS `match`
, IFNULL(i.parent_code,i.code) AS map
FROM tbl_item i
LEFT
JOIN tbl_item j
ON j.old_code = i.code
WHERE j.old_code IS NULL
UNION ALL
SELECT k.code
, k.code
FROM tbl_item k
WHERE k.old_code IS NOT NULL
) m
ON m.match = v.code
GROUP
BY m.map
跟进
问:如果CODE同时具有PARENT_CODE和OLD_CODE(我刚刚发现这是一种可能的情况,…
答:您需要测试查询以返回“匹配”和“地图”代码.
给定新的情况(一行同时包含PARENT_CODE和OLD_CODE),需要进行调整.您确实需要遍历每种情况,并确定每种情况应返回的内容.
似乎我们想将表中的所有代码(无论是在CODE列,PARENT_CODE列还是OLD_CODE列中)都选为“匹配”代码,并为每个代码派生适当的“映射”代码.
我将假设tbl_item表中的CODE列不是NULL(只是为了简化这一点.)
这些是我正在考虑的用于处理所有这些情况的四个查询:
-- rows with PARENT_CODE, match=CODE map=PARENT_CODE
SELECT i.code AS `match_code`
, i.parent_code AS `map_code`
FROM tbl_item i
WHERE i.parent_code IS NOT NULL
-- rows with PARENT_CODE and OLD_CODE, match=OLD_CODE map=PARENT_CODE
SELECT j.old_code
, j.parent_code
FROM tbl_item j
WHERE j.parent_code IS NOT NULL
AND j.old_code IS NOT NULL
-- rows with no PARENT_CODE, match=CODE map=CODE
SELECT k.code
, k.code
FROM tbl_item k
WHERE k.parent_code IS NULL
-- rows with OLD_CODE and no PARENT_CODE, match=OLD_CODE map=CODE
SELECT l.old_code
, l.code
FROM tbl_item l
WHERE l.parent_code IS NULL
AND l.old_code IS NOT NULL
可以使用UNION ALL运算符将它们组合在一起.
我可以设想古怪的数据,其中同一条CODE会出现多次,并且每个都可能指向不同的PARENT_CODE
TBL_ITEM中的一些示例古怪(意外)行.
+------+-------------+----------+
| CODE | PARENT_CODE | OLD_CODE |
+------+-------------+----------+
| 77A | 77A | NULL |
| 77A | 77B | 77A |
| 77 | 77 | 77A |
| 77 | 77A | NULL |
+------+-------------+----------+
这样的混乱怎么办?
就获得SUM(QTY)而言,我们需要确保“映射/匹配”行集中的是给定的CODE仅出现一次. (如果我们在那里有倍数,那么SUM将会太高,因为我们要匹配多个…
快速解决方案是将查询包装在另一个查询中,以消除重复并仅选择一个要映射的代码.这可能不是“正确”的解决方法,但是它为我们提供了可以使用的结果集:
SELECT u.match
, MIN(u.map) AS map
FROM (
-- query to get match/map rowset here
) u
GROUP BY u.match
然后,我们将此查询用作获得SUM(QTY)的内联视图,与以前的查询相同.我们只是在别名为m的嵌入式视图中更改了该查询.
SELECT m.map AS CODE
, SUM(v.qty) AS QTY
FROM tbl_invty v
JOIN (
SELECT u.match
, MIN(u.map) AS map
FROM (
-- query to get match/map rowset here
) u
GROUP BY u.match
) m
ON m.match = v.code
GROUP
BY m.map
在这一点上,不用说,为了使查询简单,我们真正想要的是一个只有两列的列(一个(唯一且不为null的)match_code和一个可选的map_code).
这将使查询非常简单:
SELECT IFNULL(m.map_code,m.match_code) AS CODE
, SUM(v.qty) AS QTY
FROM tbl_invty v
JOIN tbl_match_map m
ON m.match_code = v.code
GROUP
BY IFNULL(m.map_code,m.match_code)
它从给定的表中生成“ tbl_match_map”行集,这是一项艰巨的工作.
内容总结
以上是互联网集市为您收集整理的php-具有父代码的多列引用全部内容,希望文章能够帮你解决php-具有父代码的多列引用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。