Совокупное различное количество нескольких полей в одной таблице - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть база данных свойств, и в настоящее время я разрабатываю запрос дополнительных характеристик свойств. В данном случае речь идет о двух таблицах:

Это первая таблица характеристик, в которой в основном хранится мета для каждой характеристики.

Characteristics table

Это база данных CharacteristicsPerProperty, в которой я храню отношение и окончательное значение конкретной характеристики.

CharacteristicsPerProperty Table

Так что в основном я хочудля этого нужно сосчитать все уникальные значения id_propiedad (property_id), чтобы я мог показать, сколько у меня имеется с этой конкретной характеристикой. Запрос выглядит следующим образом:

SELECT 
    COUNT(DISTINCT(CaracteristicasPorPropiedad.id_propiedad)) AS disponibles
FROM
    CaracteristicasPorPropiedad
WHERE
    CaracteristicasPorPropiedad.id_caracteristica = 1
    AND
    CaracteristicasPorPropiedad.valor = 3

Таким образом, в основном вывод выглядит примерно так:

| disponibles |
|=============|
| 264         |

Здесь все работает, как и ожидалось, но я также могу включить другой параметр, скажем, вВ предыдущем примере я включил Recámaras (Спальни), но я также хочу включить Baños (Ванные комнаты). Я пытался

SELECT 
    COUNT(DISTINCT(CaracteristicasPorPropiedad.id_propiedad))
FROM
    CaracteristicasPorPropiedad
WHERE
    (CaracteristicasPorPropiedad.id_caracteristica = 1 AND CaracteristicasPorPropiedad.valor = 3)
    AND
    (CaracteristicasPorPropiedad.id_caracteristica = 2 AND CaracteristicasPorPropiedad.valor = 2.5)

Дело в том, что этот запрос возвращает 0.

Если я переключаю И на ИЛИ, он возвращает 282 результата. Мне в основном нужно сочетание обоих. Я немного застрял с этим. Что может быть запросом, чтобы смешать несколько уровней этого? Может использоваться со всеми 10 доступными размерами для этой характеристики.

1 Ответ

1 голос
/ 08 ноября 2019

Вы можете получить id_propiedad, используя агрегацию:

SELECT cpd.id_propiedad
FROM CaracteristicasPorPropiedad cpd
WHERE (cpd.id_caracteristica = 1 AND cpd.valor = 3) OR
      (cpd.id_caracteristica = 2 AND cpd.valor = 2.5)
GROUP BY cpd.id_propiedad
HAVING COUNT(DISTINCT cpd.id_caracteristica) = 2;

Если вы хотите подсчитать, используйте подзапрос:

SELECT COUNT(*)
FROM (SELECT cpd.id_propiedad
      FROM CaracteristicasPorPropiedad cpd
      WHERE (cpd.id_caracteristica = 1 AND cpd.valor = 3) OR
            (cpd.id_caracteristica = 2 AND cpd.valor = 2.5)
      GROUP BY cpd.id_propiedad
      HAVING COUNT(DISTINCT cpd.id_caracteristica) = 2
     ) p;
...