标签: join

在 SQLITE 中将多行中的列合并为一行

我有一个带有架构的 sqlite 数据库

Articles
 Id
 Name

Tags
 Id
 Name

ArticlesTags
 Id
 ArticleId
 TagId
Run Code Online (Sandbox Code Playgroud)

我正在尝试查询 Articles.Name 和标签列表。基本上我想要的是:

Name1, (tag1,tag2,tag3)
Name2, (tag3,tag2)
Run Code Online (Sandbox Code Playgroud)

这可能吗?我缺乏语言来解释我真正想做的事情,它叫什么?

我发现将多行中的列合并为单行,但它似乎仅限于 SQLServer 和内置 xml 功能的使用。

sqlite join query

4
推荐指数
1
解决办法
2万
查看次数

“城市”是否应该单独放置一张桌子?

我有以下客户表:

customer_id - int 
company_name - nvarchar
street - nvarchar
city - nvarchar
comments - nvarchar
Run Code Online (Sandbox Code Playgroud)

该应用程序将仅在一个小国家(例如 30 个城市)的部分地区使用。一位朋友告诉我,我应该将 'city' 分隔到不同的表 'Cities' 中,并在客户表中仅使用 city_id。

就我个人而言,我没有看到它有什么好处(除了在客户表上节省一些空间,在这种情况下,对于创建另一个表的成本来说,这对我来说似乎无关紧要)。

他还提到,因为我有重复的列 - city: foo, city: bar, city: foo. (同城客户很少)这不算归一化,是真的吗?

谁是对的?关于这个问题的任何启示?

join database-design tablespaces database-theory

4
推荐指数
2
解决办法
7454
查看次数

对此的替代查询(避免 DISTINCT)

注意:我使用 MSSQL 2008,但我想它对许多其他数据库引擎有效 我有这个表“用户”:

用户 ID 用户国家 ID
1 用户 1 1
2 用户 2 2
3 用户 3 3
4 用户 4 4
5 用户 5 4
6 用户 6 3

而这张表“国家”

CountryID 国家
1 MX
2 美国
3 CAN
4 英格兰

如您所见,每个用户都属于一个国家。

如果我想知道,我在用户表上至少拥有一个用户的所有不同国家/地区,现在我执行以下查询:

select distinct country 
from Users inner join
countries on users.CountryID=countries.CountryID
Run Code Online (Sandbox Code Playgroud)

并实现下一个结果集:

能够
英国
MX
美国 

这确实是所有不同的国家,其中我在 muy 表 Users 上至少有一个用户。

我的疑问是,是否可以在不使用“DISTINCT”的情况下实现上述结果集,我的意思是只使用 JOINS 和条件?

这是 de DDL 脚本:

使用 [测试]
走
/****** 对象:表 [dbo].[用户] 脚本日期:09/21/2012 16:21:14 …

sql-server-2008 join query query-refactor

4
推荐指数
2
解决办法
4万
查看次数

多对多关系

我正在研究图书数据库。除其他外,我有以下两个表(针对问题进行了一些简化):

tblBook: ID, Title
tblPerson: ID, Name
Run Code Online (Sandbox Code Playgroud)

请注意,该tblPerson表包含作者、翻译者和编辑(不仅是作者)。

很明显,这两个表是多对多的关系,所以我也有如下联结表:

tblBookAuthorJunction
tblBookTranslatorJunction
tblBookEditorJunction
Run Code Online (Sandbox Code Playgroud)

但是当涉及到加入表以选择所有角色时,我遇到了一个问题:如何创建一个查询以获得一个看起来像这样的表:

BookTitle AuthorName TranslatorName EditorName
Run Code Online (Sandbox Code Playgroud)

这是可能吗?我的查询应该是什么样的?

编辑:您可以为 RDBMS 假设 SQLite。


更新

到目前为止,有两个包含查询的答案。我想将这些答案与可能会发现此信息有价值的其他人进行比较...请注意,连接表的名称与问题中的名称略有不同。而且,是的,我知道,测试数据很无聊。

答案 1

我自己的回答中的查询如下:

SELECT B.BookTitle, P1.PersonName, P2.PersonName, P3.PersonName
FROM tblBook B
LEFT JOIN tblBookAuthor A ON B.BookID = A.BookID
LEFT JOIN tblPerson P1 ON A.AuthorID = P1.PersonID
LEFT JOIN tblBookTranslator T ON B.BookID = T.BookID
LEFT JOIN tblPerson P2 ON T.TranslatorID = P2.PersonID
LEFT JOIN tblBookEditor E ON B.BookID = E.BookID
LEFT JOIN …
Run Code Online (Sandbox Code Playgroud)

sqlite join aggregate

4
推荐指数
1
解决办法
2680
查看次数

全外连接对两个小表不起作用,错误 1064

伙计们。

我目前正在探索 MySQL 的功能,同时使用不同的查询做简单的练习。

我正在阅读以下文章,该文章解释了表 JOIN 的工作原理:

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

但是,我被困在 FULL OUTER JOIN 示例(由 tableA 和 tableB 组成):

表A:

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

mysql> select * from tablea;

+----+-----------+
| id | name      |
+----+-----------+
|  1 | Pirate    |
|  2 | Monkey    | …
Run Code Online (Sandbox Code Playgroud)

mysql join

4
推荐指数
2
解决办法
2万
查看次数

MySQL - GROUP_CONCAT 返回重复数据,不能使用 DISTINCT

我有一个规范化的数据库,我正在尝试使用 JOIN 和 GROUP_CONCAT 从多个表中返回数据。

问题:使用 GROUP_CONCAT 复制行。我不能使用 DISTINCT,因为某些数据(成分制造商)确实需要复制。

这是我当前的查询和数据库结构(SQL Fiddle):

SELECT recipe.*, 
GROUP_CONCAT(recipe_detail.ingredient_id) AS iid,  
GROUP_CONCAT(ingredient.name) AS iname, 
GROUP_CONCAT(ingredient_mfr.abbr) AS mabbr, 
GROUP_CONCAT(recipe_tag.name) AS tag
FROM  recipe
LEFT JOIN recipe_detail
    ON recipe.id = recipe_detail.recipe_id
LEFT JOIN ingredient
    ON recipe_detail.ingredient_id = ingredient.id
LEFT JOIN ingredient_mfr
    ON ingredient.mfr_id = ingredient_mfr.id
LEFT JOIN recipe_tagmap
    ON recipe.id = recipe_tagmap.recipe_id
LEFT JOIN recipe_tag
    ON recipe_tagmap.tag_id = recipe_tag.id
WHERE recipe.user_id = 1
GROUP BY recipe.id

recipe
+------------+------------+-----------+
|    id      |    name    |  user_id  | …
Run Code Online (Sandbox Code Playgroud)

mysql join duplication group-concatenation

4
推荐指数
1
解决办法
4825
查看次数

自加入?还是我错了?

我们有一张用于存储客户和物品的表。我们需要能够找到购买了一件商品而没有购买另一件商品的客户:

customer     item  
Sally        1   
Sally        2  
Sally        3
John         1  
John         2  
Paul         2
Paul         3
Run Code Online (Sandbox Code Playgroud)

我们想找到购买“1”而不是“3”的用户。在这种情况下,我们只想要“约翰”。

join except

4
推荐指数
1
解决办法
1037
查看次数

内连接和右连接相同的查询

我使用MySQL和InnoDB,我有一个表reserver2列:idReservationidChambre 我有一个表reservation和表chambre

现在我希望我的查询返回每个不在我的 dateDebut 和 dateFin 之间的“chambre.id”。

以下是我的实际查询:

SELECT cre.id
FROM   reserver AS rer
       INNER JOIN reservation AS ron
         ON rer.idReservation = ron.id
       RIGHT JOIN chambre AS cre
         ON rer.idChambre = cre.id
WHERE (ron.dateFin < ?
    OR ron.dateDebut > ?
    OR (ron.dateFin = NULL AND ron.dateDebut = NULL))
Run Code Online (Sandbox Code Playgroud)

我的问题是当 chambre 的 id 已经在 Reserver 中时,我的返回值只包含 chambre。

我的第二个问题是“RIGHT JOIN”将每个 chambre 添加到我的查询中,但我想要的只是 chambre 为:“ron.dateFin < ? OR ron.dateDebut > ?” 或尚未与储备者联系的房间。

编辑:这里有一些示例行:

储备:

id …
Run Code Online (Sandbox Code Playgroud)

mysql innodb join

4
推荐指数
1
解决办法
4297
查看次数

SQL 连接和关系

我对连接感到困惑。我想知道如何根据表之间的关系选择联接,或者联接是否不依赖关系?

  1. 如果关系是“一对一”,那么“内连接”是最好的。
  2. 如果关系是“一对多”,那么?
  3. 如果关系是“多对一”,那么?
  4. 如果关系是“多对多”,那么 left join 是最好的。

join

4
推荐指数
1
解决办法
218
查看次数

从 MySQL 子查询返回 2 列?

我是 MySQL 编程新手,但有一个问题。我创建了这个查询:

SELECT *,
       topics.createdate AS TopicCreateDate,
       (SELECT (SELECT username
                FROM   users
                WHERE  id = topicanswers.userid)
        FROM   topicanswers
        WHERE  topicid = topics.id
        ORDER  BY id DESC
        LIMIT  1)        AS LastPost
FROM   topics
       INNER JOIN categories
               ON topics.categoryid = categories.id
       INNER JOIN users
               ON topics.userid = users.id
ORDER  BY topics.lastupdate DESC
Run Code Online (Sandbox Code Playgroud)

此查询列出所有Topics、联接类别和用户,UserID以及类别 IDTopicsUsername来自TopicAnswersas LastPost。它命令它们LastUpdateTopics由 控制的范围内下降TRIGER

它工作得很好,但是这个子查询有一个问题:

            (SELECT (SELECT username
                    FROM   users
                    WHERE  id …
Run Code Online (Sandbox Code Playgroud)

mysql join subquery

4
推荐指数
1
解决办法
4353
查看次数