2015-03-19 2 views
0

Я пишу приложение и ищу конкретный оператор выбора. Ситуация в моей базе данных MYSQL является следующее:Сложный оператор выбора с SQL (mysql)

  • Каждый запись может иметь несколько единиц. Одна единица относится только к одной записи.
  • В каждом блоке может быть несколько подразделений . Одна субъединица может быть связана с несколькими единицами.

Я понял эту ситуацию со следующими таблицами:

  • запись ID (INT)
  • блок: идентификатор (целое), entry_id (интермедиат)
  • unit_subunits: unit_id (int), subunit_id (int)
  • подразделение: идентификатор (целое)

То, что я хочу сейчас следующее: Я хочу, чтобы пользователь вводит subunit.id и получает список всех entry.ids, которые содержат входной subunit.id, а а также все другие subunit.ids, которые связаны с найденными entry.ids. Результат должен lõoke как:

(вход = субъединицей 5)

entry.id | subunit.id

запись 1 | субъединица 5

запись 1 | субъединица 26

запись 2 | субъединица 2

запись 2 | субъединица 5

...

Чтобы получить только entry.ids, которые связаны с входным subunit.id, было легко. Но я не смог объединить eveything в один оператор SQL. Я решил это в своем приложении, создав два разных оператора (причем второй оператор выполняется для каждого найденного элемента entry.id). Есть ли элегантное решение, чтобы все это было в одном заявлении sql?

спасибо!

UPDATE 1

Чтобы избежать недоразумений, как в комментарии к этому вопросу: Существует на самом деле набор данных. Но для того, чтобы сделать вопрос как можно более теоретическим, общим и понятным, я уменьшил его только до «идентификаторов».

+0

Результирующий набор без набора данных является таким же глупым, как и бессмысленным. – Strawberry

+0

Уважаемый @Strawberry, что вы в действительности имеете в виду? Конечно, есть набор данных, и на самом деле entry.id является уникальным varchar, а также subunit.id. Но чтобы поставить вопрос как теоретический и простой (и, следовательно, как можно более понятным), я просто сводил его к «id». Или вы имеете в виду, я должен предоставить вам данные? Если это первый случай, я был бы рад услышать вашу конструктивную критику. – Rolch2015

ответ

1

Как первый снимок, я бы попробовал что-то вроде этого. Это может не сработать сразу (я не проверял, извиняюсь), но это может дать вам представление о возможном решении. Я бы не назвал это изящным, и я был бы очень осторожен, особенно если таблицы и/или ожидаемые результаты являются большими. Он может быть не оптимальным и может работать лучше, если он разделен на два оператора.

SELECT e.id AS entryid, us2.subunit_id AS subunitid, 
    FROM unit_subunits AS us1 
     JOIN unit AS u1 ON (us1.unit_id = u1.id) 
     JOIN entry AS e ON (u1.entry_id = e.id) 
     JOIN unit AS u2 ON (e.id = u2.entry_id) 
     JOIN unit_subunits AS us2 ON (u2.id = us1.unit_id) 
    WHERE us1.subunit_id = 5; 
+0

Большое спасибо @Fox! Ваш ответ сразу решил проблему и, что еще важнее, научил меня многому о том, как использовать JOINs в таком случае. Ура! – Rolch2015

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