记录表
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查询,但我无法解决这个问题。有人可以帮帮我吗?
答案 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 是该数据集中的正确答案...:)