Структура базы данных. Как осуществить выборку по 2 сущностям?

Имеется примерно такая структура бд.
26-06-2015(06-22-56).png
Документы (таблица doc) хранит основные свойства документа, она связана с типами (таблица type), типы например входящие, приказы,протоколы и т.д.
Есть атрибуты (таблица attribute), в ней хранится название аттрибута, например Способ отправки, Срок ответа и т.д. Аттрибуты связаны с типами, у каждого типа может быть много аттрибутов и наоборот(многие ко многим через таблицу type_attribute). Значения аттрибутов лежат в отдельной таблице и разделены по типу данных и связаны с документом. Как осуществляется связь с типом в этой схеме не указано, это не так важно.
Вывести все атрибуты конкретного документа труда не составляет
SELECT * FROM value_attribute JOIN attribute ON  value_attribute.attribute_id = attribute.id WHERE doc_id IN ("список документов")

Отфильтровать документы по одному какому нибудь аттрибуту
SELECT * FROM doc 
JOIN value_attribute ON value_attribute.doc_id = doc.id 
WHERE doc.type_id = 11 
AND( value_attribute.attribute_id = Номер атрибута AND value_varchar LIKE '%значение%')

Как отсортировать документы по двум аттрибутам одного типа в одном запросе? Тоесть сделать что то типа того
SELECT * FROM doc JOIN value_attribute ON value_attribute.doc_id = doc.id WHERE doc.type_id = 11 AND( value_attribute.attribute_id = Номер атрибута1 AND value_varchar LIKE '%значение1%' AND value_attribute.attribute_id = Номер атрибута2 AND value_varchar LIKE '%значение2%')

Если делать так, то вернуться все документы с атрибутом1 и 2. А нужно получаеться искать атрибут2 из найденных в атрибуте 1.
И вопрос вообще в целом по схеме базы, или стоит как то перестроить её? Есть какие то примеры? чтобы у какой то сущности было неограниченое количество других сущностей, или лучше разбивать все атрибуты на отдельные страницы?
  • Вопрос задан
  • 151 просмотр
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `doc`.`id` 
    FROM `doc`
    JOIN (
        SELECT `doc_id` 
            FROM `value_attribute` 
            WHERE `attribute_id` = :attr1_id AND `value_varchar` LIKE :attr1_val
    ) AS `a1` ON `a1`.`doc_id` = `doc`.`id`
    JOIN (
        SELECT `doc_id` 
            FROM `value_attribute` 
            WHERE `attribute_id` = :attr2_id AND `value_int` = :attr2_val
    ) AS `a2` ON `a2`.`doc_id` = `doc`.`id`
    ...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы