小编ype*_*eᵀᴹ的帖子

获取每组的前/后n条记录

我有两个表:tableA (idA, titleA)和tableB (idB, idA, textB)有一个在它们之间一对多的关系.对于tableA中的每一行,我想检索tableB中对应的最后5行(由idB排序).

我试过了

SELECT * FROM tableA INNER JOIN tableB ON tableA.idA = tableB.idA LIMIT 5
Run Code Online (Sandbox Code Playgroud)

但它只是限制了INNER JOIN的全局结果,而我想限制每个不同tableA.id的结果

我怎样才能做到这一点 ?

谢谢

mysql sql inner-join greatest-n-per-group

7
推荐指数
2
解决办法
5358
查看次数

Update语句导致使用NULL或最大值更新字段

如果您必须选择以下两个查询之一,您会选择哪个以及为什么:

UPDATE `table1` AS e
SET e.points = e.points+(
SELECT points FROM `table2` AS ep WHERE e.cardnbr=ep.cardnbr);
Run Code Online (Sandbox Code Playgroud)

要么:

UPDATE `table1` AS e
INNER JOIN
(
   SELECT points, cardnbr
   FROM `table2`  
) AS ep ON (e.cardnbr=ep.cardnbr)
SET e.points = e.points+ep.points;
Run Code Online (Sandbox Code Playgroud)

表的定义:

CREATE TABLE `table1` (
  `cardnbr` int(10) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `points` decimal(7,3) DEFAULT '0.000',
  `email` varchar(50) NOT NULL DEFAULT 'user@company.com',
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=25205 DEFAULT CHARSET=latin1$$

CREATE TABLE `table2` (
  `cardnbr` …
Run Code Online (Sandbox Code Playgroud)

mysql sql sql-update

7
推荐指数
1
解决办法
182
查看次数

GROUP BY查询优化

数据库是带有MyISAM引擎的MySQL.

表定义:

CREATE TABLE IF NOT EXISTS  matches  (
   id  int(11) NOT NULL AUTO_INCREMENT,
   game  int(11) NOT NULL,
   user  int(11) NOT NULL,
   opponent  int(11) NOT NULL,
   tournament  int(11) NOT NULL,
   score  int(11) NOT NULL,
   finish  tinyint(4) NOT NULL,
  PRIMARY KEY ( id ),
  KEY  game  ( game ),
  KEY  user  ( user ),
  KEY  i_gfu ( game , finish , user )
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3149047 ;
Run Code Online (Sandbox Code Playgroud)

我已设置索引,(game, finish, user)但此GROUP BY查询仍需要0.4 - 0.6秒才能运行:

SELECT user …
Run Code Online (Sandbox Code Playgroud)

mysql myisam group-by query-optimization

6
推荐指数
2
解决办法
7345
查看次数

MySQL通过另一个表找到行

我有两张桌子:

游戏

`id`        INT(11)
Run Code Online (Sandbox Code Playgroud)

game_tags

`game`      INT(11)
`tag_id`    INT(11)
Run Code Online (Sandbox Code Playgroud)

game_tags.game = game.id

我对MySQL很恐怖,所以这是我的问题:我希望能够找到games具有一定数量的MySQL tag_id.所以,如果我有四个tag_id(3,5,7,11),我希望能够通过查看game_tags表格找到哪些游戏将拥有所有这四个标签.这是我的意思的一个例子:

伪MySQL的:

SELECT *
FROM `games`
WHERE (search through game_tags table and find which rows have the same `game` field and all of the tag_id's that I need to search for)
LIMIT 0, 15
Run Code Online (Sandbox Code Playgroud)

我知道我解释了这个可怕的(不能在我的脑海里说出来),所以如果你有任何问题,请发表评论.

php mysql sql relational-division

6
推荐指数
1
解决办法
169
查看次数

如何通过最多一列获取SQL行,按另一列进行分组

我需要读取旧数据库中的用户以用于新系统中的统计信息,但我没有原始用户表.但是,有一个统计表,其中包含每年的总和,我还可以在其中找到所有需要的用户信息.此外,这也只给了我活跃的用户,这就是我需要的.

该表包含以下相关列:(统计信息列在此处不相关)

  • 用户身份
  • 名字
  • 姓
  • 电子邮件
  • 年

我希望UserID是不同的,因此它是GROUP BY中唯一可以拥有的列.我将在年份运行MAX,以获得最近一年的价值.FirstName,LastName和Email需要与MAX(Year)的行相同.换句话说,人们可能在这些年里改变了名字和电子邮件,我只想要最后一个,因为它是唯一相关的.

我对SQL查询的最佳建议是这样的:

SELECT UserID, Firstname, LastName, Email, MAX(Year) AS Year
FROM myTable
GROUP BY UserID
ORDER BY LastName, FirstName
Run Code Online (Sandbox Code Playgroud)

唯一的问题是SQL Server 2008不会让我这样做,因为所有列都必须使用MAX之类的函数或GROUP BY的一部分.FirstName,LastName和Email列不能在GROUP BY下,因为这会产生太多记录.似乎某种方式将MAX放在所有这些上,但是我无法知道MAX函数实际上在哪一列.我不确定这是一个问题,但我没有时间查看10万行,看看是否确实存在问题.

所以简而言之,我想要整行的五列,其中MAX只在一列上工作,GROUP BY在另一列上.有没有人有一个好的解决方案,或者在所有非分组行上使用MAX实际上是否安全?

sql group-by max sql-server-2008 greatest-n-per-group

6
推荐指数
1
解决办法
6736
查看次数

SQL-Server和MySQL的互操作性?

我们将从SQL-Server 2008后端转到MySQL后端.SQL-Server和MySQL之间的互操作性是什么?

我们能够运行从服务器上的数据库引用表的SQL查询吗?

例如,这是可能的: 伪代码

SELECT * 
FROM 
      [SQL2008Server].[databaseA].[DBO].[table1] as t1 
  INNER JOIN 
      [MySQLServer].[databaseB].[dbo].[table2] as t2 
          ON t1.id = t2.fkid
Run Code Online (Sandbox Code Playgroud)

如果没有,您可以推荐哪些选项来跨SQL-Server 2008和MySQL集成数据?

LINQ是否会在组合来自SQL-Server和MySQL的数据方面提供任何缓解?

mysql sql sql-server

6
推荐指数
1
解决办法
1478
查看次数

SQL中的自定义顺序

我们正在查询数据库以便以下列方式检索数据

从table1中选择a,b,... f,其中id为(6,33,1,78,2)

我从查询中得到的结果按顺序1,2,6,33,78.

我希望结果的顺序相同(6,33,1,78,2).有没有办法以相同的顺序检索数据.

编辑 *我正在使用SQL 2008*

sql sql-server-2008

6
推荐指数
1
解决办法
1502
查看次数

带LIMIT1的SQL返回所有记录

我犯了一个错误并输入了:

SELECT * FROM table LIMIT1

代替

SELECT * FROM table LIMIT 1(注意之间的空间LIMIT和1)

在MySQL的CLI中.我希望收到某种解析错误,但我很惊讶,因为查询返回了表中的所有记录.我的第一个想法是"愚蠢的MySQL,我打赌这会在PostgreSQL中返回错误",但PostgreSQL也返回了所有记录.然后用SQLite测试它 - 结果相同.

经过一番挖掘,我意识到我在桌子后输入的内容并不重要.只要没有WHERE/ORDER/GROUP条款:

SELECT * FROM table SOMETHING -- works and returns all records in table

SELECT * FROM table WHERE true SOMETHING -- doesn't work - returns parse error
Run Code Online (Sandbox Code Playgroud)

我想这是一种标准化的行为,但我找不到任何解释为什么会这样.有任何想法吗?

sql

6
推荐指数
1
解决办法
463
查看次数

MySQL Join不返回新数据库实例中两个表中匹配的数据

我一直潜伏在这里几个月,从阅读其他问题中学到很多东西,但这是我第一次勇敢地问一个问题!

SELECT  * FROM tableA a
JOIN tableB b ON b.tableBid = a.tableBid
WHERE a.tableAcol = 'paramValue';
Run Code Online (Sandbox Code Playgroud)

表B中只有39行,对于每个人来说,tableA中有一行用于paramValue和一个匹配的tableBid,所以我希望得到39行.确实在我做的另一个数据库实例中.

我在实例中看不到任何显着差异,尽管这可能是无知的,但在这个新实例中,我只能获得具有相同查询的7条记录.

如果我将查询更改为

SELECT  * FROM tableA a
LEFT JOIN tableB b ON b.tableBid = a.tableBid
WHERE a.tableAcol = 'paramValue';
Run Code Online (Sandbox Code Playgroud)

要么

SELECT  * FROM tableA a
LEFT JOIN tableB b ON a.tableBid = b.tableBid
WHERE a.tableAcol = 'paramValue';
Run Code Online (Sandbox Code Playgroud)

然后我得到了我期望的39行,a.tableBid在所有情况下匹配b.tableBid并且没有空值

我很困惑.任何人都可以解释这个.

无法发布真实数据,但我可以重现它

 CREATE TABLE tableB (  
tableBid varchar(30) NOT NULL   PRIMARY KEY,
nameB varchar(25) NOT NULL  ,
description varchar(40) NOT NULL);

CREATE TABLE tableA …
Run Code Online (Sandbox Code Playgroud)

mysql database join instance

6
推荐指数
1
解决办法
330
查看次数

从表A中选择它加入表B中的所有数据

我有一张文件表和一张标签表.文档标有各种值.

我试图创建这些标签的搜索,并且大多数情况下它正在工作.但是,当我匹配任何标签时,我会收到额外的结果.我只想要匹配所有标签的结果.

我创建了这个来说明问题http://sqlfiddle.com/#!3/8b98e/11

表和数据:

CREATE TABLE Documents
(
 DocId INT,
 DocText VARCHAR(500)
);

CREATE TABLE Tags
(
  TagId INT,
  TagName VARCHAR(50)
);

CREATE TABLE DocumentTags
(
  DocTagId INT,
  DocId INT,
  TagId INT,
  Value VARCHAR(50)
);

INSERT INTO Documents VALUES (1, 'Document 1 Text');
INSERT INTO Documents VALUES (2, 'Document 2 Text');

INSERT INTO Tags VALUES (1, 'Tag Name 1');
INSERT INTO Tags VALUES (2, 'Tag Name 2');

INSERT INTO DocumentTags VALUES (1, 1, 1, 'Value 1');
INSERT INTO DocumentTags …
Run Code Online (Sandbox Code Playgroud)

sql sql-server-2008

6
推荐指数
1
解决办法
279
查看次数