【问题标题】:Select from two table with "and" condition and MIN() function从具有“and”条件和 MIN() 函数的两个表中选择
【发布时间】:2015-11-17 00:54:37
【问题描述】:

我有桌子:

*ruletbl

| id_rule | code_rule |
-----------------------
|    1    |   R01     |
|    2    |   R01     |
|    3    |   R01     |
|    4    |   R02     |
|    5    |   R02     |
|    6    |   R02     |
-----------------------

和第二张表 *detailRulebl:

|  id_detailRule   | id_rule |  id_sym  |  codeDetailrule | orderNO |
---------------------------------------------------------------------
|        1         |    1    |     1    |     R01#1       |    1   |
|        2         |    1    |     2    |     R01#1       |    1   |
|        3         |    1    |     3    |     R01#1       |    1   |
|        4         |    2    |     4    |     R01#2       |    2   |
|        5         |    2    |     1    |     R01#2       |    2   |
|        6         |    2    |     2    |     R01#2       |    2   |
|        7         |    3    |     4    |     R01#3       |    3   |
|        8         |    3    |     3    |     R01#3       |    3   |
|        9         |    3    |     1    |     R01#3       |    3   |
|        10        |    4    |     6    |     R02#1       |    1   |
|        11        |    4    |     7    |     R02#1       |    1   |
|        12        |    4    |     5    |     R02#1       |    1   |
|        13        |    5    |     4    |     R02#2       |    2   |
|        14        |    5    |     1    |     R02#2       |    2   |
|        15        |    5    |     2    |     R02#2       |    2   |
|        16        |    5    |     8    |     R02#2       |    2   |
|        17        |    6    |     6    |     R02#3       |    3   |
|        18        |    6    |     8    |     R02#3       |    3   |
|        19        |    6    |     2    |     R02#3       |    3   |
|        20        |    6    |     1    |     R02#3       |    3   |
--------------------------------------------------------------------

如果“codeDetailrule 与“R01#1 和 R01#2”相同,则我想从输入一个数组 (1,2) 和 MIN(orderNo) 的那些表中选择“and”条件,因此首先使用“and”排除" 条件喜欢这个代码:

SELECT codeDetailrule, orderNo
FROM detailRuletbl
WHERE id_sym
IN ( 1,2 ) 
GROUP BY codeDetailrule
HAVING COUNT( * ) =2

结果:

| codeDetailRule  | orderNo |
----------------------------
|      R01#1     |    1    |
|      R01#2     |    2    |
|      R02#2     |    2    |
|      R02#3     |    3    |
----------------------------

如果我们使用 MIN(orderNO) 结果应该是:

| codeDetailRule  | orderNo |
----------------------------
|      R01#1     |    1    |----------------------> this is my expect result
|      R02#2     |    2    |
----------------------------

谁能帮助我?

到目前为止,这是我的试验:

SELECT codeDetailrule, orderNo
FROM detailRuletbl
WHERE id_sym
IN ( 1,2 ) 
GROUP BY codeDetailrule
HAVING COUNT( * ) =2
AND orderNo= ( SELECT MIN( X.orderNo) FROM detailRuletbl,
                (SELECT codeDetailrule, orderNoFROM detailRuletbl
                 WHERE id_sym IN ( 1, 2 ) GROUP BY codeDetailrule
                 HAVING COUNT( * ) =2
                 ) 
                 AS X
               )

结果:

|  codeDetailrule  | orderNo  |
-------------------------------
|    R01#1         |     1    |
-------------------------------

有人有什么想法吗?请帮忙。

【问题讨论】:

  • @rlanvin...请检查我的更新问题,这是我的试用代码...请帮助我。谢谢
  • 为什么R02#3 | 3 在结果中被淘汰了?其背后的逻辑是什么?
  • R01#2 和 R02#3 被淘汰....逻辑是: MIN(orderNo) 具有相同的 codeDetailrule 像 "R01#1 和 R01#2 它们是相同的 code_rule 在第一个table *ruletable. 和 R02#2 和 R02#3 也是一样的...

标签: mysql select datatable min


【解决方案1】:
SELECT codeDetailrule, orderNo
FROM detailRuletbl
WHERE id_sym
IN ( 1,2 ) AND orderNo IN (
SELECT MIN(orderNo) FROM detailRuletbl
                 GROUP BY orderNo
                 HAVING COUNT(*) = 2
)

如果我误解了你想要的东西,我很抱歉

【讨论】:

  • 我会试试的……伙计。
  • 当我尝试结果是空的结果伴侣..... :(,顺便说一句,我认为你的代码与我的代码太相同了,当 codeDetailrules 是与“R01#1 和 R01#2”相同
  • 尝试使用第一个子查询,也许你会发现问题。另外,我无法理解您要选择的内容。据我所知,当 orderNo 最小时,您想选择一些“id_sym”。我是对的?但是为什么你需要 HAVING COUNT(*) = 2 ?
  • HAVING COUNT(*) = 2 对于条件“and”,如果我们不使用此条件,他们将使用“or”条件进行检查,只有一个为真而不是执行,但我需要 2,而不是只有一个。顺便说一句,我得到了答案。
【解决方案2】:

我得到了 MIN() 函数的正确答案并检查“和”条件

SELECT a.codeRule, a.id_rule, MIN( a.orderNo) 
FROM (ruletbl AS b, detailRuletbl AS a)
INNER JOIN (
             SELECT h.codeDetailrule, h.id_rule AS irule, i.codeRule AS
             krule, MIN( h.oderNo) AS norderno
             FROM detailruletbl AS h, ruletbl AS i
             WHERE h.id_rule = i.id_rule
             AND h.id_sym
             IN ( 1,2 ) 
             GROUP BY h.codeDetailrule
             HAVING COUNT( * ) =2
           )sMin ON a.id_rule= sMin.irule
          GROUP BY sMin.krule

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多