SELECT user.login,book.name 来自用户 LEFT JOIN书ON user.login = book.author 在哪里user.login ='peter'
现在我明白了:
peter book1
peter book2
peter book2
我希望得到:
peter book1
book2
book2
数据库:MySQL 感谢
答案 0 :(得分:3)
你不能这样做......
第2册有作者,为什么会显示空白?
为什么您希望输出完全如此?可能有更好的方法来做你需要的东西,如果你解释得更好,我们可能会有所帮助。
: - )
答案 1 :(得分:3)
应将SQL请求的每一行视为一个独立的行。你想要输出的方式意味着book2和book3没有作者(这不是真的)。
由于您不想在作者列中重复数据,并且此列始终相同,因此无法打印此列
SELECT book.name
FROM book
WHERE user.login = 'peter'
你会得到
book1
book2
book2
答案 2 :(得分:3)
我同意其他人的观点,虽然这可以在SQL中执行,但它实际上不应该。
以下假设每本书只能有一位作者,实际情况并非如此:
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)
在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
这是你需要的吗?
答案 4 :(得分:0)
我已将此视为最终用户不希望重复列值的常见请求。
您没有指定您正在使用的数据库,因此我将提供Oracle答案。
您可以使用LAG函数检查LAG值是否等于当前值,如果是,则将其替换为NULL。
答案 5 :(得分:0)
这取决于数据库的结构方式以及数据库中实际保存的数据。从查询的外观来看,我不确定您希望的结果是否可行。
我认为问题在于您从用户表中选择user.login,这将始终存在,因为如果不存在,查询将根本不返回任何结果(即,连接取决于用户。包含记录的登录)。即使您尝试使用其他JOIN方法,我认为您将始终返回user.login。如果您尝试更改查询以便查找book.author,则会产生相同的效果,因为查询依赖于user.login和book.author相同的事实。
很有可能是那些对SQL有更多经验的人可以给出答案,但据我所知,这个名字将永远被退回。
也许如果你对其他事情有所了解,我们或许可以提出另一种选择。
TL; DR:因为user.login和book.author是相同的,所以无法获得所需的结果。