根据其他 table 的值计算 (*) 行

Count (*) rows based on values from other table

记录TABLE

record_id  type_id   title
---------  -------   -----
1          1         Title1
2          2         Title2
3          1         Title3
4          2         Title4

记录值

id   record_id   field_id  field_value
--   ---------   --------  -----------
1    1           8         active 
2    2           12        some value
3    1           16        lenght
4    2           3         some value

我想计算来自记录 table 的记录,其中 type_id = 1 AND 来自记录值 table field_id_8 字段值 = 活动 AND field_id_16 字段值 = 长度。

基于上面的两个例子table查询return 1(record_id = 1是唯一适合查询的行)。

我可以创建简单的 MYSQL 查询,但我无法解决这个问题。谁能帮帮我?

编辑: 好的,第一次我被误解了这个问题我希望现在我想对了。

如果我在下面的评论中是正确的,这应该适合你:

SELECT COUNT(DISTINCT(rt.record_id)) AS COUNTED
FROM record_table rt
INNER JOIN record_values rv
ON rt.record_id = rv.record_id
WHERE rt.type_id = 1 AND 
(8 IN (SELECT rv2.field_id
       FROM record_values rv2
       WHERE rv2.record_id = rt.record_id) AND 
'active' IN (SELECT rv2.field_value
             FROM record_values rv2
             WHERE rv2.record_id = rt.record_id)) AND
 (16 IN (SELECT rv2.field_id
         FROM record_values rv2
         WHERE rv2.record_id = rt.record_id) AND
 'lenght' IN (SELECT rv2.field_value
              FROM record_values rv2
              WHERE rv2.record_id = rt.record_id))

这是 sql fiddle http://sqlfiddle.com/#!9/7be41/14 所以你可以检查它现在是否有效...

GL!

再编辑:

当你有这样的数据时:

 +------+-----------+----------+-------------+
 | id   | record_id | field_id | field_value |
 +------+-----------+----------+-------------+
 |  xx  |     7     |    23    |   active    |
 +------+-----------+----------+-------------+
 |  xx  |     7     |    16    |   lenght    |
 +------+-----------+----------+-------------+
 |  xx  |     7     |    8     |  some value |
 +------+-----------+----------+-------------+
 | etc...                                    |

是否要包含并计算该数据。如果您想从答案的开头使用查询。如果您不想被计算在内,请使用此查询:

SELECT COUNT(DISTINCT(rt.record_id)) AS COUNTED
FROM record_table rt
INNER JOIN record_values rv
ON rt.record_id = rv.record_id
WHERE rt.type_id = 1 AND 
8 IN (SELECT rv2.field_id
      FROM record_values rv2
      WHERE rv2.record_id = rt.record_id AND
      rv2.field_value = 'active') AND
16 IN (SELECT rv2.field_id
       FROM record_values rv2
       WHERE rv2.record_id = rt.record_id AND
       rv2.field_value = 'lenght')

此查询将仅计算 record_id,其中在 record_values table 中有两行,如下所示:

 +------+-----------+----------+-------------+
 | id   | record_id | field_id | field_value |
 +------+-----------+----------+-------------+
 |  xx  |     y     |    8     |   active    |
 +------+-----------+----------+-------------+
 |  xx  |     y     |    16    |   lenght    |
 +------+-----------+----------+-------------+

希望这有助于您理解这两个查询之间的区别。这是 SQL Fiddle,对于第二个查询,您可以稍微处理一下数据,看看发生了什么 http://sqlfiddle.com/#!9/c52bf/2

注意 第二个 fiddle 我在 table 中更改了一些数据来测试它以免混淆...

GL!

再编辑一次

ups 我刚刚意识到有更好的方法来解决这个问题。希望不会太晚...

SELECT COUNT(*)
FROM record_values rv
INNER JOIN record_values rv2
ON rv.record_id = rv2.record_id
WHERE rv.field_id = 8 AND rv.field_value = 'active' AND 
      rv2.field_id = 16 AND rv2.field_value = 'lenght'

我觉得这个查询对你的问题更方便...

这是 SQL Fiddle 的...

注意 我在那里添加了一些用于测试的值,因此 2 是该数据集中的正确答案... :)