MySQL选择查询
我有三张桌子t1、t2和t3。下面是他们的模式 我需要加入他们,并且有条件MySQL选择查询,mysql,sql,Mysql,Sql,我有三张桌子t1、t2和t3。下面是他们的模式 我需要加入他们,并且有条件 In t1 table, objectName can be one of 4: 'ABC', 'DEF', 'GHI', or 'JKL'. If t1.objectName is 'ABC', I need to join t1.idObject with t2.id1. If t1.objectName is 'DEF', I need to join t1.idObject with with t2.id2.
In t1 table, objectName can be one of 4: 'ABC', 'DEF', 'GHI', or 'JKL'.
If t1.objectName is 'ABC', I need to join t1.idObject with t2.id1.
If t1.objectName is 'DEF', I need to join t1.idObject with with t2.id2.
If t1.objectName is 'GHI', I need to join t1.idObject with t2.id3.
If t1.objectName is 'JKL', I need to join t1.idObject with t3.id4.
I need to select t1.idObject, t1.objectName, t2.custName, t4.Message.
另外,如果t1.objectName是'DEF'或'GHI',我希望custName在select结果中为null
--
--
如有疑问或解释,将不胜感激
非常感谢。SQL背后的思想是,它允许您用SQL术语表达确切的需求,例如:
SELECT
whatever you need, including
CASE WHEN t1.objectName in ( 'DEF' , 'GHI')
THEN NULL
ELSE t2.custName
END AS custName
FROM
t1, t2, t3
WHERE
(t1.objectName = 'ABC' AND t1.idObject = t2.id1)
OR
(t1.objectName = 'DEF' AND t1.idObject = t2.id2)
OR
...
我希望您可以将其扩展到所有需求。使用联合来组合每个查询的结果:
SELECT t1.idObject, t1.objectName, t2.custName, NULL Message
FROM t1 JOIN t2 ON (t1.idObject = t2.id1)
WHERE t1.objectName = "ABC"
UNION ALL
SELECT t1.idObject, t1.objectName, NULL custName, NULL Message
FROM t1 JOIN t2 ON (t1.idObject = t2.id2)
WHERE t1.objectName = "DEF"
UNION ALL
SELECT t1.idObject, t1.objectName, NULL custName, NULL Message
FROM t1 JOIN t2 ON (t1.idObject = t2.id3)
WHERE t1.objectName = "GHI"
UNION ALL
SELECT t1.idObject, t1.objectName, NULL custName, Message
FROM t1 join t3 ON (t1.idObject = t3.id4)
WHERE t1.objectName = "JKL"
您没有提到它,但我假设在ABC、DEF、GHI案例中,Message
应该为空,因为在t2
中没有这样的列,而在JKL案例中,custName
应该为空,因为在t3
中没有这样的列
要对结果进行排序,需要将UNION设置为子查询:
SELECT * FROM (
SELECT t1.idObject, t1.objectName, t2.custName, NULL Message
FROM t1 JOIN t2 ON (t1.idObject = t2.id1)
WHERE t1.objectName = "ABC"
UNION ALL
SELECT t1.idObject, t1.objectName, t2.custName, NULL Message
FROM t1 JOIN t2 ON (t1.idObject = t2.id2)
WHERE t1.objectName = "DEF"
UNION ALL
SELECT t1.idObject, t1.objectName, t2.custName, NULL Message
FROM t1 JOIN t2 ON (t1.idObject = t2.id3)
WHERE t1.objectName = "GHI"
UNION ALL
SELECT t1.idObject, t1.objectName, NULL custName, Message
FROM t1 join t3 ON (t1.idObject = t3.id4)
WHERE t1.objectName = "JKL" ) x
ORDER BY idObject, custName, Message
您可以使用大小写语法:您想选择
t4.Message
?没有表t4
,所以我猜你的意思是t3
。但是当objectName
是JKL
时,您只能使用t3
进行连接,否则应该是什么呢?任何包含三个不同标识列的表都代表着糟糕的设计。我认为这是一个家庭作业,考虑到设计强制大量使用连接和条件,并且这里似乎没有上下文。也许我想错了。哇!你真的试过这个吗?假设t1
和t2
成功连接,那么t3
中的每一行现在都将连接到该结果中。。。如果你尝试这个,你会看到你得到了疯狂的结果。没错。如果问题只是决定要与t2
中的哪一列联接,那么这就行了,但是由于要联接的表也依赖于objectName
,因此它根本不能正常工作。在上述要求中,如果我删除“如果t1.objectName是'DEF'或'GHI',我希望custName在select结果中为null。”查询是什么样子的?你能在下面发帖吗?表现很差
很大方,另一个答案给出了完全愚蠢的结果。然而,这一个从我这里得到+1:)在上述要求中,如果我删除“如果t1.objectName是'DEF'或'GHI',我希望custName在select结果中为null。”查询会是什么样子?请您在下面发帖好吗?只需将t2.custName
放在那些SELECT子句中,而不是NULL custName
@Barmar如何在上面的查询中按订单?只是为了使用单一订单。。。?按idObject、objectName、custName、Message排序。谢谢
SELECT * FROM (
SELECT t1.idObject, t1.objectName, t2.custName, NULL Message
FROM t1 JOIN t2 ON (t1.idObject = t2.id1)
WHERE t1.objectName = "ABC"
UNION ALL
SELECT t1.idObject, t1.objectName, t2.custName, NULL Message
FROM t1 JOIN t2 ON (t1.idObject = t2.id2)
WHERE t1.objectName = "DEF"
UNION ALL
SELECT t1.idObject, t1.objectName, t2.custName, NULL Message
FROM t1 JOIN t2 ON (t1.idObject = t2.id3)
WHERE t1.objectName = "GHI"
UNION ALL
SELECT t1.idObject, t1.objectName, NULL custName, Message
FROM t1 join t3 ON (t1.idObject = t3.id4)
WHERE t1.objectName = "JKL" ) x
ORDER BY idObject, custName, Message