Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql,连接两个表_Sql_Mysql - Fatal编程技术网

sql,连接两个表

sql,连接两个表,sql,mysql,Sql,Mysql,选择user.login、book.name 来自用户 左联书 user.login=book.author 其中user.login='peter' 现在我得到: peter book1 peter book2 peter book2 我希望得到: peter book1 book2 book2 数据库:MySQL 谢谢你不能那样做 第二本书有作者,为什么会显示空白 你到底为什么希望你的输出是这样的?也许有更好的方法来满足您的需求,如果您能更好地解释一下,我们可能会

选择user.login、book.name 来自用户 左联书 user.login=book.author 其中user.login='peter'

现在我得到:

peter book1
peter book2
peter book2
我希望得到:

peter book1
      book2
      book2
数据库:MySQL
谢谢你不能那样做

第二本书有作者,为什么会显示空白

你到底为什么希望你的输出是这样的?也许有更好的方法来满足您的需求,如果您能更好地解释一下,我们可能会提供帮助


:-

我认为这是终端用户的常见请求,他们不想重复列值

您没有指定正在使用的数据库,因此我将提供一个Oracle答案

您可以使用LAG函数检查LAG值是否等于当前值,如果是,则用NULL替换它。

在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

这就是您需要的吗?

这取决于数据库的结构以及数据库中实际保存的数据。从查询的外观来看,我不确定您想要的结果是否可能

我认为问题在于,您正在从用户表中选择user.login,这将始终存在,因为如果不这样做,查询将不会返回任何结果,即连接依赖于包含记录的user.login。即使您尝试使用其他联接方法,我认为您也会始终返回user.login。如果您尝试更改查询,以便改为查找book.author,这将产生相同的效果,因为查询依赖于user.login和book.author是相同的事实

很可能有人对SQL更有经验,可以给出答案,但据我所知,这个名字总是会被返回的

也许如果你能深入了解其他正在发生的事情,我们可以提出一个替代方案


TL;DR:因为user.login和book.author是相同的,所以不可能得到期望的结果。

SQL请求的每一行都应该被视为一个独立的行。您希望输出的方式意味着book2和book3没有作者,这是不正确的

由于您不想重复“作者”列中的数据,且此列始终相同,因此无法打印此列

SELECT book.name
FROM book
WHERE user.login = 'peter'
你会得到

book1
book2
book2

我同意其他人的看法,虽然这是可以在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支持的变量来存储author/login值。如果CASE表达式与当前存储在变量中的内容不匹配,则将其设置为返回列值。如果变量和列值匹配,零长度字符串将占用列值-如果愿意,可以将其更改为NULL

我包括了一个ORDER BY,因为您可能希望多个名称都出现这种情况,因为如果没有ORDER BY,就无法保证数据顺序


我必须使用一个子查询,否则,设置变量的列将出现在结果集中。

peter写过book2吗?第二册有作者吗?第二册的作者与彼得不同吗?需要更多的信息。可能会发布两个表中的示例数据。我不想不必要地重复相同的数据。我使用Mysqldatabase@gloris-然后不要在前端显示它。查询没有给你重复的信息。@Gloris-我同意Donnie的观点。UI应该是您将不必要的重复数据移出视图的地方。请看我的答案了解详细信息。这不是一行归还所有的书吗?@Tim-是的。由新行字符分隔。+1,因为在给定请求的情况下,此返回的行集似乎尽可能规范化。每行有一位作者和一些书。每行有一定数量的书都有一位作者。考虑到这个请求,这很好。伙计,我非常怀念与Oracle PLSQL的合作。小心,有些人会因为你提供的答案在给定的数据库中不起作用而给你打分。但是你可以在MySQL中模拟LEAD/LAG功能——请参阅此链接了解详细信息:是的——我一直在寻找oracle的正确答案——这让我有些恼火:。。。但是在本例中,海报最初没有指定数据库-尽管我现在看到它说mySQL。。。在任何情况下,延迟技巧在可用时都像一个符咒。