2010-07-11 2 views
0

ВЫБЕРИТЕ user.login, book.name ОТ пользователя LEFT JOIN книга ON user.login = book.author WHERE user.login = 'питер'SQL, соединить две таблицы

Теперь я получаю:

peter book1 
peter book2 
peter book2 

Bu я желаю получить:

peter book1 
     book2 
     book2 

База данных: MySQL Благодаря

+0

Имеет письменную книгу peter2? У книги 2 есть автор? Не отличается ли автор книги2 к peter? Требуется немного больше информации. –

+0

Возможно, отправьте пример данных из двух таблиц. –

ответ

3

Я согласен с другими, что, хотя это то, что может быть выполнено в SQL, это действительно не должно be.

Далее предполагается, что может быть только один автор в книге, которая не относится к реальности:

SELECT x.author, 
     x.book_name 
    FROM (SELECT CASE 
       WHEN @author != u.login THEN u.login 
       ELSE '' 
       END AS author, 
       b.name AS book_name, 
       @author := u.login AS set_variable 
      FROM USER u 
    LEFT JOIN BOOK b ON b.author = u.login 
      JOIN (SELECT @author := '') r 
     WHERE u.login = 'peter' 
     ORDER BY u.login) x 

Он использует переменную (только MySQL поддерживает это, к моему знанию), чтобы сохранить автора/значение входа. Выражение CASE установлено для возврата значения столбца, если оно не соответствует тому, что в настоящее время хранится в переменной. Если переменная и значение столбца совпадают, строка с нулевой длиной будет занимать значение столбца - вы можете изменить это как NULL, если хотите.

Я включил ORDER BY, если вы хотите, чтобы это произошло для нескольких имен, потому что нет способа гарантировать заказ данных без ORDER BY.

Мне пришлось использовать подзапрос, в противном случае столбец, в котором будет установлен параметр, появится в вашем наборе результатов.

3

Вы не можете сделать это таким образом ...

В книге 2 есть ли у автора, почему бы вам показать пробел?

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

:-)

+0

Я не хочу излишне дублировать одни и те же данные. Я использую базу данных Mysql – user319854

+1

@gloris - Тогда не показывайте ее в своем интерфейсе. Запрос не дает вам дублируемую информацию. – Donnie

+0

@ Глорис - Я согласен с Донни на этом. Пользовательский интерфейс должен быть там, где вы берете «ненужные дублированные данные» вне поля зрения. – HarveySaayman

0

я видел это как общий запрос от конечных пользователей, которые не хотят, чтобы повторить значение столбцов.

Вы не указали, какую базу данных вы используете, поэтому я предлагаю ответ Oracle.

вы можете использовать функцию LAG, чтобы проверить, соответствует ли значение LAG текущему значению, и если да, замените его NULL.

+0

вам нужен пример кода. –

+0

Человек, я так скучаю, работая с Oracle PLSQL. Будьте осторожны, есть некоторые, кто вас пометит, чтобы дать ответ, который не будет работать в данной базе данных. Но вы можете эмулировать функциональность LEAD/LAG в MySQL - см. Эту ссылку для получения дополнительной информации: http://explainextended.com/2009/03/10/analytic-functions-first_value-last_value-lead-lag/ –

+0

yep - я был за которым отвечают правильные ответы оракула, которые меня любят:) ... но в этом случае плакат не указывал базу данных изначально - хотя теперь я вижу, что он говорит mySQL ... во всяком случае, трюк LAG работает как шарм когда возможно. – Randy

2

В MySQL вы можете сделать.

SELECT user.login, group_concat(book.name SEPARATOR '\n') AS book 
FROM user 
LEFT JOIN book ON 
user.login = book.author 
WHERE user.login = 'peter' 
GROUP BY user.login 

Это то, что вам нужно?

+0

Не вернет ли он все книги в одну строку? – Tim

+0

@ Тим - Да. Отделяется новым символом линии. –

+0

+1, потому что этот набор строк выглядит как можно более нормализованным, учитывая запрос. в каждой строке есть автор и некоторое количество книг. каждая строка с некоторым количеством книг имеет одного автора. Учитывая просьбу, это хорошо. –

0

Это зависит от структуры вашей базы данных и данных, которые фактически хранятся в базе данных. По внешнему виду запроса я не уверен, что результат, который вам нужен, возможен.

Я думаю, проблема в том, что вы выбираете user.login из таблицы пользователя, это всегда будет существовать, потому что, если это не так, запрос не возвращает никаких результатов вообще (то есть, соединение зависит от пользователя .login, содержащий запись). Даже если вы попытались использовать другие методы JOIN, я думаю, что вы всегда получите возврат user.login. Если вы попытаетесь изменить запрос, чтобы вместо этого вы искали book.author, это будет иметь тот же эффект, поскольку запрос зависит от того, что user.login и book.author одинаковы.

Там очень хорошо может быть кто-то, у которого гораздо больше опыта работы с SQL, который может дать ответ, но, насколько мне известно, имя всегда будет возвращено.

Возможно, если вы дадите некоторое представление о том, что еще происходит, мы можем предложить альтернативу.

TL; DR: Поскольку user.login и book.author одинаковы, невозможно получить желаемый результат.

3

Каждая строка запроса SQL должна рассматриваться как независимая строка. То, как вы хотите, означает, что book2 и book3 не имеют автора (что неверно).

Поскольку вы не хотите повторять данные в колонке автора и этот столбец всегда то же самое, вы не могли бы напечатать эту колонку

SELECT book.name 
FROM book 
WHERE user.login = 'peter' 

вы получите

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