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