我确定之前有人问过这个问题,但目前我似乎无法找到符合我情况的任何内容。
基本上我有一个表格,其列名称ShipsWithOrder
可能包含key ID
或可能为空。我需要根据key ID
AND 在表格中找到一行,如果ShipsWithOrder
列 IS NOT NULL ,那么我需要获取那一排。
类似
SELECT * FROM TABLE WHERE KEY = ID OR SHIPSWITH = ID
--HERES WHERE IT GETS A LITTLE COMPLICATED--
If it found a row where "KEY = ID"
AND that row's "SHIPSWITH" column IS NOT NULL
THEN I need to ALSO include
the row whose KEY ID
matches the first one's SHIPSWITH value
因此,如果订单123附带订单456,那么当我搜索订单123或456时,我会返回 2 行而不仅仅是一行,但我只会知道 1 的价值。有意义吗?
此外,是否有可能使这个多余?我不认为它发生在这里,但为了以防万一,在这种情况下,是否可以 循环 我的if / case?
也许我还应该提一下,只是因为一行ship with
列不为空,并不意味着具有匹配ID的行将具有匹配的ship with
列。大多数情况下,辅助行的ship with
列
如果我的表格如下:
+-------+-----------+
| Key | ShipsWith |
+-------+-----------+
| 1 | NULL |
| 2 | 5 |
| 3 | 6 |
| 4 | NULL |
| 5 | NULL |
| 6 | NULL |
| 7 | 4 |
| 8 | NULL |
| 9 | 8 |
+-------+-----------+
我寻找Key 1
然后我应该回到 只有1 行。 1
的行,因为 不 附带任何内容,也不附带任何内容。
但是,如果我搜索2
,那么我应该返回 2 结果。我应该为密钥2
以及密钥5
获取一行,因为5 附带 2!
答案 0 :(得分:1)
也许使用UNION
:
SELECT * FROM TABLE WHERE KEY = ID OR SHIPSWITH = ID
UNION
SELECT * FROM TABLE WHERE KEY = (SELECT SHIPSWITH FROM TABLE WHERE KEY = ID OR SHIPSWITH = ID)
第一部分返回主项目(使用原始查询)。第二部分返回ShipsWith项(如果存在)。如果ShipsWith为NULL,则不会为查询的这一部分返回任何内容。我应该指出,这只会降低一级。如果你需要返回一个完整的ShipsWith关系层次结构,那么我们将不得不做更好的事情。
答案 1 :(得分:1)
select @_ship:=ship ship, t.* from table t where key=ID
union all
select ship, t.* from table t where key=@_ship;
有一个fiddle
答案 2 :(得分:1)
如果只有一个深度,那么就可以加入同一个表:
SELECT t1.*
FROM Table t1
LEFT OUTER JOIN Table t2 ON t2.ShipsWith = t1.Key
WHERE t1.Key = 123 OR t1.ShipsWith = 123 OR t2.Key = 123
但是,如果订单形成更长的链条'
+-------+-----------+
| Key | ShipsWith |
+-------+-----------+
| 1 | 2 |
| 2 | 3 |
| 3 | NULL |
+-------+-----------+
然后你需要越来越多的连接,例如:
SELECT t1.*
FROM Table t1
LEFT OUTER JOIN Table t2 ON t2.ShipsWith = t1.Key
LEFT OUTER JOIN Table t3 ON t3.ShipsWith = t2.Key
WHERE t1.Key = 123 OR t1.ShipsWith = 123 OR t2.Key = 123 OR t3.Key = 123
显然,这不能很好地扩展。对于无限链长,您需要递归。 SQL Server有一个很好的递归功能,叫做Common Table Expressions(简称CTE)。 MySQL还没有(还)。在这里寻找替代方案:
Generating Depth based tree from Hierarchical Data in MySQL (no CTEs)