2015-04-26 2 views
1

ЗАПИСИ ТАБЛИЦЫ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 и из записи значения field_id_8 Значение поля = активное Иfield_id_16 значение поля = длина.

На основе двух примерных таблиц над запросом return 1 (record_id = 1 - единственная строка, которая подходит для запроса).

Я могу создать простые запросы MYSQL, но я не могу ничего сделать для решения этой проблемы. Кто-нибудь может мне помочь?

+0

Я не могу видеть field_id_8 (что хорошая вещь, я думаю) – Strawberry

+0

@danielbidala Привет, я думаю, что я понял лучший способ ... Посмотрите на нижнюю часть моего ответа. Я добавляю окончательный запрос, на который я надеюсь :) –

+0

Ты потрясающий. Все ваши решения работали. Последний - самый быстрый способ. – danielbidala

ответ

0

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 для этого ...

Примечание добавить несколько больше значения там для тестирования, чтобы является правильным ответом в этом наборе данных ... :)

+0

Спасибо за помощь! Да, вы поняли это. Он работает, но мне нужен И вместо OR в вашем примере. К сожалению, с И это не работает, я не знаю, почему. Любое предложение? – danielbidala

+0

ouuuu теперь я вижу :) В принципе, мне не нужна эта часть AND field_value = 'active' в предложении WHERE, потому что когда field_id = 8, зарегистрированное значение всегда «активно». Я прав? –

+0

здесь я отредактировал свой ответ, если эта работа ... :) –

Смежные вопросы