基于来自其他表的值计算(*)行

时间:2015-04-26 17:23:51

标签: mysql sql count

记录表

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

我想计算记录表记录表type_id = 1和FROM记录值表field_id_8字段值=活动 AND field_id_16字段值= lenght。

基于上面的两个示例表,查询返回1(record_id = 1是唯一适合查询的行)。

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

1 个答案:

答案 0 :(得分:0)

修改 好的,我第一次被误解了,我希望现在我认为这是正确的问题。

如果我在下面的评论中是正确的,这应该对你有用:

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))

这是http://sqlfiddle.com/#!9/7be41/14的sql小提琴,所以你可以检查它现在是否有用......

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表中有两行,如下所示:

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

希望这有助于您了解这两个查询之间的区别。这是SQL Fiddle和第二个查询,这样你就可以玩一些数据,看看发生了什么http://sqlfiddle.com/#!9/c52bf/2

注意在第二小提琴中我改变表中的一些小数据来测试它,以免混淆......

GL!

ONE MORE EDIT

我意识到有更好的方法可以解决这个问题。希望不要太晚......

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 是该数据集中的正确答案...:)