2014-09-08 2 views
0

я написал следующий MySQL QueryMySQL присоединиться к указывающему колонку

select g.*, (case when count(sg.seriesid) > 0 then 1 else 0 end) as checked 
from genre g 
join seriesgenre sg on sg.genreid = g.id and sg.seriesid = 1; 

Результаты запроса в нуле | null | 0

Есть ли способ избежать возврата какого-либо результата, когда условие соединения не выполняется?

Edit:

Понял, что этот запрос возвращает только один гребли результат. Я хочу, чтобы результирующий набор отображал все жанры с помощью столбца, указывающего, имеет ли конкретная серия жанр. (Указанный выше индикатор равен 0,1)

+2

Вы хотите, чтобы запрос ** НЕ ** дал вам какой-либо результат, если условие ** НЕ ** встречено? – Youness

+0

да в короткие сроки – user2742831

ответ

0

Вы можете добавить предложение HAVING в конец вашего запроса, например.

HAVING checked > 0 

Обратите внимание, что поскольку нет GROUP BY положения о запросе, запрос будет возвращать не более одной строки. Это допустимый оператор SQL, но он возвращает нечетный результат, поскольку это очень необычный прецедент, который удовлетворяет этот результат.

(Извлечение агрегата COUNT() будет также предотвратить ряд от возвращения, но тогда оператор будет также то потенциально вернуть более одной строки. Это не совсем ясно, что ResultSet вы хотите вернулся.)


Followup

Q: результат я хочу перечислить все жанры, доступные с колонкой, которая указывает, имеет ли определенный ряд жанр.

A: Но это совсем другой результат, чем тот, который возвращается OP-запросом.

Обычный шаблон для результата, как это, чтобы возвратить «все» строку из жанра (при условии, что есть столбец или комбинация столбцов в genre, который является уникальным) с помощью операции соединения будет:

SELECT g.id 
    , g.foo 
    , sg.genreid IS NULL AS checked 
    FROM genre g 
    LEFT 
    JOIN seriesgenre sg 
    ON sg.genreid = g.id 
    AND sg.seriesid = 1 
GROUP 
    BY g.id 
    , g.foo 

Если id является уникальным в таблице genre, тогда g.foo может быть опущен из предложения GROUP BY. Это нормальный образец.

Если вы хотите опустить строки из genre, которые не имеют соответствующей строки в рядуgenre, то просто удалите ключевое слово LEFT, чтобы сделать операцию соединения «внутренним» соединением, а не «внешним» соединением.

Если кортеж (genreid,seriesid) является уникальным, мы можем исключить предложение GROUP BY, так как нам гарантировано, что операция JOIN вернет не более одной соответствующей строки из таблицы seriesgenre, например.

SELECT g.id 
    , g.foo 
    , sg.genreid IS NULL AS checked 
    FROM genre g 
    LEFT 
    JOIN seriesgenre sg 
    ON sg.genreid = g.id 
    AND sg.seriesid = 1 

В более общем случае, если id не является уникальным в genre, или там не набор столбцов, что делает строку в genre уникальным, то мы должны были бы избежать разрушения строк с GROUP BY пункт, и использовать коррелировала подзапрос вместо операции JOIN:

SELECT g.id 
    , g.foo 
    , IFNULL(SELECT 1 
       FROM seriesgenre sg 
       WHERE sg.genreid = g.id 
        AND sg.seriesid = 1 
       LIMIT 1 
     ),0) AS checked 
    FROM genre g 

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

SELECT g.id 
    , g.foo 
    , (SELECT 1 
      FROM seriesgenre sg 
      WHERE sg.genreid = g.id 
      AND sg.seriesid = 1 
      LIMIT 1 
     ) AS checked 
    FROM genre g 
HAVING checked = 1 
+0

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