Цикл в MySql, или альтернатива? - PullRequest
0 голосов
/ 27 июля 2010

У меня есть база данных MySql с таблицами innoDB.Очень упрощенно это выглядит как две таблицы:

Таблица A:

  • controlID (PK)
  • controlText

Таблица B:

  • controlOptionID (pk)
  • controlID (от FK до таблицы A)
  • controlOptionType
  • controlOptionValue

Так много controlOptions (таблица B) могут ссылаться на один элемент управления (давая этому элементу управления несколько опций).Но для каждой опции в таблице B сделаны две строки: одна строка с controlOptionType = "linkToCreator" и controlOptionValue = (идентификатор шаблона, из которого она была сделана *).А другая строка type = "optionSelected" и value = "true" (или false).

  • = это довольно сложная настройка, но в основном вместо заданных столбцов мы делаем динамическиес помощью типа, который был бы назван столбец.Поэтому я не могу связать шаблон с FK.

Так что теперь мне нужно выбрать каждый элемент управления (который будет иметь 2 controlOptions, связывающихся с ним), где одно значение controlOptionValue равно true или false (в зависимости от того, что мне нужно), а другой controlOptionValue - это текстовый идентификатор, который я указываю.

Что я думаю, лучший способ сделать это -

SELECT * FROM tableB WHERE controlOptionType = 'linkToCreator'

Затем выполните циклэтот набор результатов гласит:

SELECT * FROM tableB WHERE tableB.controlID = (the controlID in this iterations row) AND tableB.controlValue = 'true'

Но, возможно, это действительно неэффективно, и в любом случае я понятия не имею, как это сделать.Было бы здорово, если бы я мог получить один запрос (т.е. не используя хранимые процедуры), в котором я указал templateID и true или false, и он дал бы мне результат строки, если он ничего не нашел.

Кстати, этодля поиска в нашем приложении с помощью TONS нужно пройти строки, поэтому производительность имеет первостепенное значение.И да, я знаю, что установка не самая лучшая ...

Спасибо: D

Ответы [ 2 ]

4 голосов
/ 27 июля 2010

Как это?

<code>SELECT * FROM tableA AS A
LEFT JOIN tableB AS ctrl1 ON (A.controlID = ctrl1.controlID AND ctrl1.controlOptionType = ? AND ctrl1.controlOptionValue = ?)
LEFT JOIN tableB AS ctrl2 ON (A.controlID = ctrl2.controlID AND ctrl2.controlOptionType = ? AND ctrl2.controlOptionValue = ?)</p>

<p>
0 голосов
/ 27 июля 2010

Попробуйте это:

SELECT * 
FROM Table_A 
LEFT JOIN Table_B
ON Table_A.ControlID = Table_B.ControlID
WHERE Table_A.controlOptionType = 'linkToCreator
...