我有两个表: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的结果
我怎样才能做到这一点 ?
谢谢
如果您必须选择以下两个查询之一,您会选择哪个以及为什么:
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) 数据库是带有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) 我有两张桌子:
游戏
`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)
我知道我解释了这个可怕的(不能在我的脑海里说出来),所以如果你有任何问题,请发表评论.
我需要读取旧数据库中的用户以用于新系统中的统计信息,但我没有原始用户表.但是,有一个统计表,其中包含每年的总和,我还可以在其中找到所有需要的用户信息.此外,这也只给了我活跃的用户,这就是我需要的.
该表包含以下相关列:(统计信息列在此处不相关)
我希望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-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的数据方面提供任何缓解?
我们正在查询数据库以便以下列方式检索数据
从table1中选择a,b,... f,其中id为(6,33,1,78,2)
我从查询中得到的结果按顺序1,2,6,33,78.
我希望结果的顺序相同(6,33,1,78,2).有没有办法以相同的顺序检索数据.
编辑 *我正在使用SQL 2008*
我犯了一个错误并输入了:
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)
我想这是一种标准化的行为,但我找不到任何解释为什么会这样.有任何想法吗?
我一直潜伏在这里几个月,从阅读其他问题中学到很多东西,但这是我第一次勇敢地问一个问题!
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) 我有一张文件表和一张标签表.文档标有各种值.
我试图创建这些标签的搜索,并且大多数情况下它正在工作.但是,当我匹配任何标签时,我会收到额外的结果.我只想要匹配所有标签的结果.
我创建了这个来说明问题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 ×8
mysql ×6
group-by ×2
database ×1
inner-join ×1
instance ×1
join ×1
max ×1
myisam ×1
php ×1
sql-server ×1
sql-update ×1