EDIT: OK Впервые я был неправильно понял вопрос. Надеюсь, сейчас я правильно это понял.
Если я был прав в комментариях ниже, это должно работать для вас:
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 скрипки для этого 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, как это:
+------+-----------+----------+-------------+
| id | record_id | field_id | field_value |
+------+-----------+----------+-------------+
| xx | y | 8 | active |
+------+-----------+----------+-------------+
| xx | y | 16 | lenght |
+------+-----------+----------+-------------+
Надеются, что это поможет конечным вам понять разница между этими двумя запросами. Вот SQL Скрипка и для этого второго запроса, так что вы можете играть немного с данными и посмотреть, что случилось http://sqlfiddle.com/#!9/c52bf/2
ПРИМЕЧАНИЯ во второй скрипке я немного изменить данные в таблице, чтобы проверить его так, чтобы не путать ...
GL!
ONE MORE EDIT
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 для этого ...
Примечание добавить несколько больше значения там для тестирования, чтобы является правильным ответом в этом наборе данных ... :)
Я не могу видеть field_id_8 (что хорошая вещь, я думаю) – Strawberry
@danielbidala Привет, я думаю, что я понял лучший способ ... Посмотрите на нижнюю часть моего ответа. Я добавляю окончательный запрос, на который я надеюсь :) –
Ты потрясающий. Все ваши решения работали. Последний - самый быстрый способ. – danielbidala