Объединение нескольких запросов одной и той же таблицы в один оператор SQL - PullRequest
6 голосов
/ 26 декабря 2011

Я пытаюсь объединить эти запросы MySQL, но не получаю их правильно.Вот псевдокод, который я надеюсь объединить, чтобы получить однострочный SQL-оператор.

$var1 = "abc"
$var2 = "def"

IF ( $var1 IN (SELECT DISTINCT col1 FROM t1) )
{
    SELECT colA, colB, colC FROM t1 WHERE col1 = $var1 AND col2 LIKE '%$var2%'
}
ELSE
{
    SELECT colA, colB, ColC FROM t1 WHERE col2 LIKE %$var1%
}

Спасибо

Ответы [ 2 ]

5 голосов
/ 26 декабря 2011

Сначала позвольте мне сказать, что mjfgates может быть правильным.Оригинальный код psuedo не является «плохим» только потому, что он занимает два шага.Чем сложнее ваш оператор SQL, тем больше шансов, что механизм запросов может не найти оптимальный план.В данном конкретном случае это менее вероятно, потому что есть только одна таблица, на которую мы ссылаемся несколько раз, но в этих ситуациях следует иметь в виду нечто общее.Получение SQL-кода для одного оператора не всегда является достойной целью.

Теперь, чтобы ответить на ваш вопрос:

   select colA,colB,colc from table1 t1
    where 
    (
    (col1 = $var1 and col2 like '%$var2%') and 
            EXISTS (select 1 from table1 t2 where t2.col1 = $var1)
    )
    or 
    (
    (col2 LIKE %$var1%) and 
           NOT EXISTS (select 1 from table1 t3 where t3.col1 = $var1)
    )
3 голосов
/ 26 декабря 2011

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

Кроме того, здесь может появиться ошибка.Что произойдет, если в таблице есть элементы, в которых col1 = $ var1, но ни один из этих элементов не имеет col2, например $ var2?Что должно произойти?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...