标签: mysql

在GROUP BY之后应用WHERE

我有一个表,其中的项目是一个线程的一部分,因此它们有一个线程ID,每个项目也有一个日期(UNIX时间戳).所以我的表看起来像(UNIX时间戳简化):

+-----------------------------+
|  id |   date  |  thread_id  |
+-----+---------+-------------+
|  1  |   1111  |      4      |
|  2  |   1333  |      4      |
|  3  |   1444  |      5      |
|  4  |   1666  |      5      |
+-----------------------------+
Run Code Online (Sandbox Code Playgroud)

我想要做的是选择线程ID,其中共享相同线程ID的所有项都小于传递的日期.因此,如果我想要所有项目早于1555(日期<1555)的线程ID,我只会期望返回线程ID 4,而不是5,即使它有一个日期小于1555的项目.所以这就是我尝试:

SELECT * FROM table WHERE date < 1555 GROUP BY thread_id ORDER BY date DESC
Run Code Online (Sandbox Code Playgroud)

我正在尝试对该查询执行的操作是按照具有最高日期值的项目的线程ID对所有项目进行分组,并从那里获取日期小于1555的项目.但是这不起作用,它仍将返回线程ID 5,因为它有一个超过1555的项目.

总而言之,我如何只选择所有项目都比特定日期更早的线程ID?

感谢您的时间!

mysql group-by

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

为什么在MySQL中删除此索引会加速我的查询100x?

我有以下MySQL表(简化):

CREATE TABLE `track` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(256) NOT NULL,
  `is_active` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `is_active` (`is_active`, `id`)
) ENGINE=MyISAM AUTO_INCREMENT=7495088 DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)

'is_active'列标记了我想在大多数但不是全部查询中忽略的行.我有一些查询定期从这个表中读取块.其中一个看起来像这样:

SELECT id,title from track where (track.is_active=1 and track.id > 5580702) ORDER BY id ASC LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

此查询需要一分钟才能执行.这是执行计划:

> EXPLAIN SELECT id,title from track where (track.is_active=1 and track.id > 5580702) ORDER BY id ASC LIMIT 10;
+----+-------------+-------+------+----------------+--------+---------+-------+---------+-------------+
| id | select_type | table | type | possible_keys  | key    | …
Run Code Online (Sandbox Code Playgroud)

mysql indexing

10
推荐指数
1
解决办法
1424
查看次数

使用mysqlimport时是否无法显示警告?

本文:http://www.linuxask.com/questions/how-to-show-the-warnings-during-mysqlimport

说使用mysqlimport时无法显示警告:

当您使用mysqlimport从文本文件导入数据时,将在导入结束时显示警告数.但是没有办法显示实际的警告信息.

那是准确的吗?我有一个不允许LOAD DATA INFILE的服务器.

mysql mysqlimport load-data-infile

10
推荐指数
2
解决办法
7734
查看次数

SUM()基于SELECT的不同条件

您有没有办法可以根据与SELECT语句的其余部分不同的条件来执行SUM(total_points),所以我希望每行的SUM(total_points)<= to $ choosentrack?但SELECT语句的其余条件是它们的下面.我需要他们全部归还.我正在填写一张排行榜.

非常感谢您的帮助.

SELECT
    members.member_id,
    members.teamname,
    SUM(total_points) as total_points,
    total_points as last_race_points 
FROM
    members,
    members_leagues,
    member_results 
WHERE
    members.member_id = members_leagues.member_id 
    AND members_leagues.league_id = '$chosenleague' 
    AND member_results.track_id = '$chosentrack' 
    AND members_leagues.start_race = '$chosentrack' 
    AND member_results.member_id = members_leagues.member_id
GROUP BY
    members.member_id 
ORDER BY
    member_results.total_points DESC,
    last_race_points DESC, 
    members.teamname DESC
Run Code Online (Sandbox Code Playgroud)

mysql sql

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

如何"授予创建用户"作为非root用户?

我有一个数据库,我希望用户能够创建新用户.这可以通过GRANT CREATE USER实现,如下所示:

grant create user on *.* to foo;
Run Code Online (Sandbox Code Playgroud)

这很好用,foo可以创建用户.我的问题是如果以root身份运行上面的行,但是如果作为普通用户运行则不起作用,即使此类用户已具有CREATE USER权限.

简而言之,普通用户无法委派创建用户的能力.我一直在寻找能够做到这一点的任何特殊权限,而且我开始认为只有root才能做到这一点,尽管我在MySQL文档中没有找到任何证据.

问题是:如何让普通用户让新用户创建用户?

mysql

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

使用多个左连接优化MySQL查询

我有一个NewsStories表,我还要加入一些相关的表.每个新闻故事可以有多个图像,类别和地址.所以查询本质上是:

SELECT * FROM NewStories 

LEFT JOIN Images ON Newstories.id=Images.story_id

LEFT JOIN Categories ON NewsStories.id=Categories.story_id

LEFT JOIN Addresses ON NewsStories.id=Addresses.story_id

WHERE ...
Run Code Online (Sandbox Code Playgroud)

每个故事通常有一些图像和地址,以及1或2个类别.NewsStories表有大约10,000篇文章.

麻烦的是性能相当慢(大约15-20秒,虽然它确实变化很大,有时下降到5秒).

我想知道是否有更好的方法来组织查询以加快速度(我对SQL很新).

特别是,给定故事的行数乘以图像数乘以地址数乘以类别数量似乎相当浪费.

我基本上试图将新闻故事的属性重建为一个我可以在前端操作的对象.

这是解释(如果格式化不正确,请道歉).我猜我没有正确索引地址,如果它是"使用在哪里".那是对的吗?

id  select_type table   type    possible_keys   key key_len ref rows    Extra

1   SIMPLE  Addresses   ALL NULL    NULL    NULL    NULL    6640    Using where

1   SIMPLE  NewsStories eq_ref  PRIMARY PRIMARY 767 NewsStories.Addresses.story_id 1    Using where

1   SIMPLE  Images  ref PRIMARY PRIMARY 767 NewsStories.NewsStories.id  1   Using index

1   SIMPLE  Categories  ref PRIMARY PRIMARY 767 NewsStories.NewStories.id   1
Run Code Online (Sandbox Code Playgroud)

mysql sql optimization

10
推荐指数
1
解决办法
6201
查看次数

操作'concat'的非法混合排序

我正在尝试在mysql中执行此concat查询

SELECT CONCAT(if(fName,fName,''),Name) 
From Student
Run Code Online (Sandbox Code Playgroud)

错误:

#1271 - 操作'concat'的非法混合排序

mysql sql

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

根据MySQL表创建C#类

是否有任何内置于.Net或visual studio中的内容可以让我根据MySql表创建类.我想我在谈论持久性.我只想让类成为表的1​​对1映射.有什么免费的吗?

.net c# mysql database persistence

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

我用什么结构类型的HTML内容(MySQL)

我想将一个缩小的HTML字符串放入数据库行 - 请记住它可能是一个非常大的字符串,我将使用以下哪种结构类型:

http://d.pr/2URu

我试过LONGTEXT但是当我尝试插入时似乎没有用.

html mysql sql

10
推荐指数
1
解决办法
5254
查看次数

MySql语句准备"不坚持"

我正在尝试使用预准备语句,而MySqlCommand执行得很好,执行时间非常糟糕.我让它将cmd.IsPrepared的结果写入控制台,果然,它是假的.这是我设置MySqlCommand的地方:

MySqlCommand cmd = con.CreateCommand();
cmd.CommandText = @"INSERT INTO dict (pre, dist, dict.char, score) VALUES(@pre, @dist, @char, @score) ON DUPLICATE KEY UPDATE score = score + @score";
cmd.Parameters.Add("@pre", MySqlDbType.VarChar, 32);
cmd.Parameters.Add("@dist", MySqlDbType.Int32);
cmd.Parameters.Add("@char", MySqlDbType.VarChar, 1);
cmd.Parameters.Add("@score", MySqlDbType.Double);
cmd.Prepare();
Run Code Online (Sandbox Code Playgroud)

在添加具有相同结果的参数之前,我还尝试执行Prepare().

然后,我有一个代码循环,它执行一些计算并设置变量,如下所示:

cmd.Parameters[3].Value = score;
Run Code Online (Sandbox Code Playgroud)

...在运行时间之前,对命令不做任何其他操作:

Console.WriteLine(cmd.IsPrepared);
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

控制台的结果总是错误的.这一切都是在一个基本的交易中完成的,但这似乎不应该搞砸了.不过,我在设置MySqlCommand之前会打开事务.

关于这出错的任何想法?

编辑:我在java中复制了代码,准备好的语句可以正常工作.所以这不是我的数据库服务器本身的问题,它特别是.net中的一个问题.当然,.net /连接器并没有为每个人打破,所以这可能是什么交易?

并且它肯定没有准备好,根本就没有设置bool值,.net对于某些测试输入的运行时间太长了我没有耐心等待它,但在java中相同的输入运行在~3分钟.两者使用基本相同的代码.

这是我在.net中做的一个简单的测试,所以你可以看到我正在尝试的完整代码(我从连接字符串中删除了UID和密码,但是在正常的代码中,它们就在那里,建立了连接,并且语句将数据输入数据库):

        using (MySqlConnection con = new MySqlConnection(@"SERVER=localhost;DATABASE=rb;UID=;PASSWORD=;"))
        {
            con.Open();

            using (MySqlCommand cmd = con.CreateCommand())
            {
                cmd.CommandText = @"INSERT INTO test (test.test) VALUES(?asdf)";
                cmd.Prepare(); //doesn't work

                cmd.Parameters.AddWithValue("?asdf", 1);

                cmd.ExecuteNonQuery();
            } …
Run Code Online (Sandbox Code Playgroud)

c# mysql

10
推荐指数
1
解决办法
2994
查看次数