Union具有正确顺序的两个查询的结果

时间:2012-09-16 18:22:10

标签: mysql

我的数据库表A和表B中有两个表 -

                   Table `A`
    SN   |    Order1    |   Order2   |   Text
 (INT)   |   (TINYINT)  |  (TINYINT) |  (VARCHAR)
   1001  |      1       |      1     |    ABC
   1001  |      1       |      2     |    DEF
   1001  |      1       |      3     |    GHI
   1001  |      2       |      1     |    IOU
   1001  |      3       |      1     |    JKL     <--
   1001  |      3       |      2     |    LMO
   1001  |      3       |      3     |    UTF
   ....
   1021  |      1       |      1     |    ZXC
   1021  |      1       |      2     |    QWE
   1021  |      2       |      1     |    JKL     <--
   1021  |      3       |      1     |    YOU

在另一张表中

                   Table `B`
    SN   |    Order1    |     rSN    |   rOrder1
   1021  |      2       |     1001   |      3

现在,当我查询1021的数据时,结果应该是: -

         Result Needed

    1    |      1     |    ZXC
    1    |      2     |    QWE
    2    |      1     |    JKL
    2    |      2     |    LMO
    2    |      3     |    UTF
    3    |      1     |    YOU

目前我正在尝试这样的事情 -

SELECT `SN`, `Order1`, `Order2`, `Text` FROM `Table A` 
  WHERE `SN`=1012 
UNION  
SELECT `SN`, `Order1`, `Order2`, `Text` FROM `Table A`  
  WHERE `Table A`.`SN` 
  IN (SELECT  `rSN` FROM `Table B` WHERE `SN`=1021) 
  AND `Table A`.`Order1` 
  IN (SELECT  `Order1` FROM `Table B` WHERE `SN`=1021) 

正在给出如此结果: -

             Result
  SN | Order1 |   Order2   |    Text
 1021|   1    |      1     |    ZXC
 1021|   1    |      2     |    QWE
 1021|   2    |      1     |    JKL
 1021|   3    |      1     |    YOU
 1001|   3    |      1     |    JKL
 1001|   3    |      2     |    LMO
 1001|   3    |      3     |    UTF

如何让结果的最后三行的Order1Order2与引用行相同,例如1001 | 2 | 2 | LMO

编辑---

我想在查询提供数据输出时,将Order1的{​​{1}}值与1001的{​​{1}}相同。

由于Order1的顺序很重要。

Order2 Text与Order1中此组中对应的第一个值相关 并1012存储对数据库中已输入的重复相关文本的引用,并在相应的Text

中定义其位置

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案: -

<强>解决方案

SELECT `Order1`, `Order2`, `Text` FROM `Table A` WHERE `SN` = 1012
UNION DISTINCT
SELECT `Table B`.`Order1`,  `Table A`.`Order2`, `Table A`.`Text` 
FROM  `Table A` JOIN  `Table B` 
WHERE  `Table B`.`rSN` =  `Table A`.`SN` 
      AND  `Table B`.`Order1` =  `Table A`.`Order1` 
      AND `Table B`.`SN` = 1021
ORDER BY `Order1`, `Order2`

<强>解释

第一个SELECT选择与Rows

相关联的1021

第二部分查询中,我希望引用的TextSN行的1001具有Order1值{{ 1}}(参见表B)。
但是正如引用3 那样。 SN 1021Order1 ,其文本为2(参见表A,指向行(“&lt; 1&gt; - “)与1021 SN)
因此,我们希望与JKL格式化为Order1相关联的文字1001 | 3 |的所有值 对于上述问题1001 | 2 | Works,Joining给出了一个表格: -

JOIN

从这个结果我们可以拿起结果集。
了解SELECT * FROM `Table A` JOIN `Table B` WHERE `Table B`.`rSN` = `Table A`.`SN` AND `Table B`.`Order1` = `Table A`.`Order1` AND `Table B`.`SN` = 1021 Table `B` Table `A` SN | Order1 | rSN | rOrder1 || SN | Order1 | Order2 | Text 1021 | 2 | 1001 | 3 || 1001 | 3 | 1 | JKL 1021 | 2 | 1001 | 3 || 1001 | 3 | 2 | LMO 1021 | 2 | 1001 | 3 || 1001 | 3 | 3 | UTF 的来源 - &gt;就在这里现在我们正在接收2, 2, LMO来自JOIN结果而不是像之前的那样我们正在挑选Table B.Order1的{​​{1}},然后结果订购我们不想要的订单。

Order1 - &gt;与其相关的信息,
具有相同1001的信息会相互显示相关的字词/信息,因为why isn't 1, 3, GHI required as a part of result没有任何相关信息Order1因此 <结果部分。

现在我们已经得到了第二个查询的1021,它应该是1, 3, GHI而不是Order1我们现在可以通过订单子句轻松地命令它们

我希望这也能澄清这个问题。 还是谢谢大家:)

------编辑-------

UNION中的

2将从最终结果中删除3的重复条目