MySQL选择查询

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.

我有三张桌子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. 
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