【问题标题】:MySQL - Count rows in main table with some condition and equals specific valuesMySQL - 以某些条件计算主表中的行并等于特定值
【发布时间】:2014-09-21 16:08:54
【问题描述】:

我有两个表,第一个名为 table1

ID  |  Name    |  Type | isActive | isDeleted | 
-----------------------------------------------
1   |  item 1  |  4    |  1       |  0        |
2   |  item 2  |  2    |  1       |  0        |
3   |  item 3  |  1    |  1       |  1        |
4   |  item 4  |  1    |  1       |  0        |
5   |  item 5  |  1    |  1       |  0        |
6   |  item 6  |  3    |  1       |  0        |
7   |  item 7  |  1    |  1       |  0        |
8   |  item 8  |  2    |  1       |  0        |
9   |  item 9  |  1    |  1       |  0        |
10  |  item 10 |  1    |  1       |  0        |

AND 第二个名为 table1_meta

ID  |  table1_id  | options    | value
------------------------------------
1   |  1          | dont_ask   |  1   
2   |  2          | dont_ask   |  1
3   |  5          | dont_ask   |  1
4   |  6          | dont_ask   |  1
5   |  8          | alwasys_ask|  1
6   |  9          | alwasys_ask|  1
7   |  1          | is_flagged |  1
8   |  2          | is_flagged |  0
9   |  3          | is_flagged |  0
10  |  4          | is_flagged |  0
11  |  5          | is_flagged |  0
12  |  6          | is_flagged |  1
13  |  7          | is_flagged |  0
14  |  8          | is_flagged |  0
15  |  9          | is_flagged |  0
16  |  10         | is_flagged |  0

我正在尝试计算 table1 中满足某些特定条件的行,其中一些条件。

WHERE 条件必须包含以下条件:

table1.type = 1 and table1.isActive = 1 and table1.isDeleted = 0 and table1_meta.options = 'is_flagged' and table1_meta.value = 0

还有这个:

table1_meta.options = 'dont_ask' and table1_meta.value = 1

还有这个:

table1_meta.options = 'always_ask' and table1_meta.value = 1

那么,我该怎么做呢?

SQLFiddle 链接:http://sqlfiddle.com/#!2/2eb27b

谢谢。

【问题讨论】:

    标签: mysql sql assignment-operator multiple-tables


    【解决方案1】:

    我假设您正在尝试计算第一个表中的行数。这是使用子查询的一种方式:

    select count(*)
    from table1 t1
    where t1.type = 1 and t1.isActive = 1 and t1.IsDeleted = 0 and
          exists (select 1
                  from table1_meta tm
                  where t1.id = tm.table1_id and tm.options = 'is_flagged' and tm.value = 0
                 ) and
          not exists (select 1
                      from table1_meta tm
                      where t1.id = tm.table1_id and
                            tm.options = 'dont_ask' and tm.value = 1
                     ) and
          exists (select 1
                  from table1_meta tm
                  where t1.id = tm.table1_id and
                        tm.options = 'always_ask' and tm.value = 1
                 );
    

    这对元表上的每个条件都有一个单独的子查询。

    【讨论】:

    • 是的,第一个表是主表,我正在尝试计算该表中的行数。感谢您的回答,但我在查询中看不到“always_ask”条件。我需要计算所有条件的行。再次感谢。
    • 我想我无法解释我需要什么。对不起我的英语不好。我需要计算 table1 中除标记为“dont_ask”之外的所有行,但结果必须(可以更改其他条件)始终包含标记为“always_ask”。上面的查询没有提供它。
    【解决方案2】:

    我想我找到了问题的答案。

    查询是:

    SELECT Count(*) AS total FROM
            (SELECT Count(*)
            FROM   table1 t1,
                   table1_meta t1meta
            WHERE  t1.type = 1
                   AND t1.isactive = 1
                   AND t1.isdeleted = 0
                   AND t1meta.options = 'is_flagged'
                   AND t1meta.value = 0
                   AND t1.id NOT IN (SELECT table1_id
                                     FROM   table1_meta tm
                                     WHERE  tm.options = 'dont_ask'
                                            AND tm.value = 1)
            UNION
            SELECT Count(*)
            FROM   table1_meta tm,
                   table1 t1
            WHERE  t1.id = tm.table1_id
                   AND tm.options = 'always_ask'
                   AND tm.value = 1) x
    

    无论如何,谢谢,戈登。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 2017-05-18
      • 2016-03-20
      • 2017-05-19
      • 1970-01-01
      • 2017-06-12
      相关资源
      最近更新 更多