选择ID = value的所有位置,如果不为空,也可以获取ID =列值的位置

时间:2014-04-02 16:02:54

标签: mysql

我确定之前有人问过这个问题,但目前我似乎无法找到符合我情况的任何内容。

基本上我有一个表格,其列名称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

NULL


如果我的表格如下:

+-------+-----------+
|  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!

3 个答案:

答案 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)