我有一个带有架构的 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 功能的使用。
我有以下客户表:
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. (同城客户很少)这不算归一化,是真的吗?
谁是对的?关于这个问题的任何启示?
注意:我使用 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 …
我正在研究图书数据库。除其他外,我有以下两个表(针对问题进行了一些简化):
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。
到目前为止,有两个包含查询的答案。我想将这些答案与可能会发现此信息有价值的其他人进行比较...请注意,连接表的名称与问题中的名称略有不同。而且,是的,我知道,测试数据很无聊。
我自己的回答中的查询如下:
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) 伙计们。
我目前正在探索 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) 我有一个规范化的数据库,我正在尝试使用 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) 我们有一张用于存储客户和物品的表。我们需要能够找到购买了一件商品而没有购买另一件商品的客户:
customer item
Sally 1
Sally 2
Sally 3
John 1
John 2
Paul 2
Paul 3
Run Code Online (Sandbox Code Playgroud)
我们想找到购买“1”而不是“3”的用户。在这种情况下,我们只想要“约翰”。
我使用MySQL和InnoDB,我有一个表reserver2列:idReservation和idChambre
我有一个表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 编程新手,但有一个问题。我创建了这个查询:
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以及类别 IDTopics和Username来自TopicAnswersas LastPost。它命令它们LastUpdate在Topics由 控制的范围内下降TRIGER。
它工作得很好,但是这个子查询有一个问题:
(SELECT (SELECT username
FROM users
WHERE id …Run Code Online (Sandbox Code Playgroud) join ×10
mysql ×4
query ×2
sqlite ×2
aggregate ×1
duplication ×1
except ×1
innodb ×1
subquery ×1
tablespaces ×1