2013-08-21 4 views
0

Предположим, что мне нужен список всех моих книг вместе с автором и его именем. Но я хочу только известных авторов, или если они не известны, то они должны быть из страны ид 123.MySql Query with join conditions

SELECT book.id, author.name, country.name 
FROM book 
LEFT JOIN author ON author.id = book.authorid 
LEFT JOIN country ON country.id = author.countryid 
WHERE author.famous = 1 OR (author.famous = 0 AND country.id = 123) 

Этот запрос дает мне список всех книг, которые имеют известный автор или из страны 123. Но Я также хочу книги без автора, так что я добавить «author.id равно нулю или ...»

SELECT book.id, author.name, country.name 
FROM book 
LEFT JOIN author ON author.id = book.authorid 
LEFT JOIN country ON country.id = author.countryid 
WHERE (author.id is null or (author.famous = 1 OR (author.famous = 0 AND country.id = 123))) 

Но здесь у нас есть проблемы, теперь у нас есть все книги, которые имеют известный автор или автор из страны 123 И книги без автора.

Но книги, у которых есть автор, который не знаменит, а не из страны 123, не входят в список. Как я могу управлять этим в 1 запросе? Или это невозможно, и мне нужен подзапрос?

Мне нужно было объединить условия на нескольких таблицах, но это невозможно.

Спасибо!

Редактировать: Просто убедитесь, что все понимают проблему. В конце концов, я хочу список все мои книги, а рядом с книгами, которые я хочу, информацию об авторе, но только если автор известен, или если он из CountryId 123.

Мои запросы имели ошибку так здесь лучший запрос

SELECT book.id, author.name, country.name 
FROM book 
LEFT JOIN author ON author.id = book.authorid 
LEFT JOIN country ON country.id = author.countryid 
WHERE author.id is null OR author.famous = 1 OR country.id = 123 

Но с этим запросом я до сих пор не получаю книги с не-известным автором снаружи CountryId 123. Я хочу, чтобы эти книги в списке без автора информации рядом с ним.

Так что я не хочу вступать в книгу с автором, когда автор не знаменит, а не из страны 123!

ответ

1

Прежде всего, у вас есть ошибка в первом запросе. Здесь author.famous = 1 OR (author.famous = 1 AND country.id = 123) вы получаете только книги, которые их автор знаменит И от 123. Может быть, вы имели в виду author.famous = 1 OR (author.famous = 0 AND country.id = 123), но для этого тоже бесполезно. Достаточно двух условий.

Вы можете просто написать:

SELECT book.id, author.name, country.name 
FROM book 
LEFT JOIN author ON author.id = book.authorid 
LEFT JOIN country ON country.id = author.countryid 
WHERE (author.famous = 1 OR country.id = 123) 

Для второго запроса, попробуйте следующее:

SELECT book.id, author.name, country.name 
FROM book 
LEFT JOIN author ON author.id = book.authorid 
LEFT JOIN country ON country.id = author.countryid 
WHERE (author.id is null OR author.famous = 1 OR country.id = 123) 
+0

У меня была ошибка, я имел в виду author.famous = 1 OR (author.famous = 0 AND country.id = 123). Я изменил это. И вы правы относительно бесполезной проверки author.famous = 0. Но все же страна такая же, и я не получаю книги незаслуженных авторов из-за пределов страны. 123 – Tim

+0

@ Тим, вы уверены, что ваш первый запрос дает вам книги не известных от 123? – Itay

1

Пожалуйста, попробуйте с этим запросом:

SELECT book.id, author.name, country.name 
FROM book 
LEFT JOIN author ON author.id = book.authorid 
LEFT JOIN country ON country.id = author.countryid 
WHERE author.id is null or author.famous = 1 or (author.famous = 0 AND country.id = 123) 

Также я изменил

or (author.famous = 1 AND country.id = 123) 

в

or (author.famous = 0 AND country.id = 123) 

из

или если они НЕ известные, они должны быть из страны ид 123

На самом деле это не так сильно отличается от вашего запроса, Я просто опустил устаревшие скобки, но я не вижу, почему это не должно работать. Вы уверены, что в вашей базе есть книги без автора?

+0

Нет необходимости в 'author.famous = 1 или (author.famous = 0 AND country.id = 123)' ... Это достаточно '(author.famous = 1 OR country.id = 123)' – Itay

+0

Это * возможно * Не нужно в этом случае, но я привык писать запросы ** безопасно ** и точно до точки. – fancyPants

+0

Я предполагаю, что это Boolean, поэтому я не вижу смысла в этом. Но я вижу вашу точку зрения. – Itay

0

Попробуйте этот запрос, вы получите любую книгу:

SELECT book.id, if(author.famous <> 0 or country.id = 123,GROUP_CONCAT(author.*),null), country.name 
FROM book 
LEFT JOIN author ON author.id = book.authorid 
LEFT JOIN country ON country.id = author.countryid 

Благодарность

+0

Нет, я до сих пор не получаю книги с незнакомым автором из другой страны, чем 123 – Tim

+0

, но вы сказали это «или если они не знамениты, они должны быть из страны id 123.» – Felquir

+0

Да, поэтому я хочу, чтобы все книги, и если есть автор, который известен или из страны 123, я хочу, чтобы его информация была рядом с ним. Else Я хочу только книгу – Tim

0

Допуская автор известно, когда author.famous = 1 и не известные, когда это 0, ваш первый набор, где условия выглядит неправильно, она выглядит в настоящее время фильтр только известных авторов, независимо от страны, она должна быть:

WHERE author.famous = 1 OR country.id = 123 

Если окончательные набор данных вы ищете комбинированный:

  • Всех книги от известных авторов (независимо от страны)
  • Всех книг из страны идентификатора 123 (независимо от известности)
  • Всех книг без авторов (независимо от страны)

Вашего условие было бы:

WHERE author.famous = 1 OR country.id = 123 OR author.id is null