嘿所有,我有一个需要优化的查询.它有效,但它是一只狗,性能明智.
它看起来像这样:
SELECT *
FROM (
SELECT *
FROM views
WHERE user_id = '1'
ORDER BY
page DESC
) v
GROUP BY
v.session
Run Code Online (Sandbox Code Playgroud)
我正在跟踪不同页面的视图,我想知道每个会话的最高页面,以便知道他们在任何给定的时间点击了多远(他们需要一直查看每个页面)会话.
基本上我要做的是在GROUP之前对结果进行排序.以上实现了这一点,成本很高.
任何人都可以拍我的头脑怎么做?多谢你们!
更新:
解释:
"1" "PRIMARY" "<derived2>" "ALL" \N \N \N \N "3545" "Using temporary; Using filesort"
"2" "DERIVED" "views" "index" \N "page" "5" \N "196168" "Using where"
Run Code Online (Sandbox Code Playgroud)
架构:
ID int(8) unsigned (NULL) NO PRI (NULL) auto_increment select,insert,update,references
page int(8) (NULL) YES MUL (NULL) select,insert,update,references
user_id int(8) (NULL) YES (NULL) select,insert,update,references
session int(8) (NULL) YES (NULL) …Run Code Online (Sandbox Code Playgroud) 问题是获取表列数据并将其用作IN函数的值列表;
在这个例子中,我创建了2个表:电影和流派
表"电影"包含3列:id,name和流派.表"genres"包含2列:id和name.
+- movies-+
| |- movie_id - int(11) - AUTO_INCREMENT - PRIMARY
| |- movie_name - varchar(255)
| |- movie_genres - varchar(255)
|
|
+- genres-+
|- genre_id - int(11) - AUTO_INCREMENT - PRIMARY
|- genre_name - varchar(255)
Run Code Online (Sandbox Code Playgroud)
两个表都包含一些虚拟数据:
+----------+------------+--------------+
| movie_id | movie_name | movie_genres |
+----------+------------+--------------+
| 1 | MOVIE 1 | 2,3,1 |
| 2 | MOVIE 2 | 2,4 |
| 3 | MOVIE 3 | 1,3 |
| 4 | MOVIE 4 | …Run Code Online (Sandbox Code Playgroud) 我在SQL中有两个表,一个有项目,另一个有项目所属的类,即JOIN看起来大致如下:
Project | Category
--------+---------
Foo | Apple
Foo | Banana
Foo | Carrot
Bar | Apple
Bar | Carrot
Qux | Apple
Qux | Banana
Run Code Online (Sandbox Code Playgroud)
(显然,字符串替换为更高正常形式的ID,但你明白了这一点.)
我想要做的是允许过滤,以便用户可以选择任意数量的类别,结果将被过滤到属于所有选定类别的成员的项目.例如,如果用户选择类别"Apple"和"Banana",则显示项目"Foo"和"Qux".如果用户选择类别"Apple","Banana"和"Carrot",则只显示"Foo"项目.
我尝试的第一件事是一个简单的SELECT DISTINCT项目FROM ... WHERE Category ='Apple'和Category ='Banana',但当然这不起作用,因为Apple和Banana在两个不同的行中显示在同一列中对于任何共同的项目.
GROUP BY和HAVING对我没有任何好处,所以告诉我:有没有一种明显的方法可以做到这一点,我错过了,或者它是否真的如此复杂以至于我不得不求助于递归连接?
顺便说一句,这是在PostgreSQL中,但当然,标准SQL代码在可能的情况下总是更好.
使用MySQL 5
我有这样一张桌子:
date (varchar)
door (varchar)
shift (varchar)
route (varchar)
trailer (varchar)
+ other fields
Run Code Online (Sandbox Code Playgroud)
此表包含用户生成的内容(从另一个"主"表复制),并防止用户创建相同数据超过1倍,表具有基于上面指定的字段创建的唯一索引.
问题是"重复预防"索引不起作用.
用户仍然可以添加重复记录而不会报告错误.
这个问题是由于我对索引的工作原理不了解吗?
要么
是否可能与主键字段冲突(自动增量int)?
CREATE TABLE如下所示:
CREATE TABLE /*!32312 IF NOT EXISTS*/ "tableA" (
"Date" varchar(12) default NULL,
"door" varchar(12) default NULL,
"Shift" varchar(45) default NULL,
"route" varchar(20) default NULL,
"trailer" varchar(45) default NULL,
"fieldA" varchar(45) default NULL,
"fieldB" varchar(45) default NULL,
"fieldC" varchar(45) default NULL,
"id" int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY ("id"),
UNIQUE KEY "duplicate_preventer" ("Date","door","Shift","route","trailer"),
Run Code Online (Sandbox Code Playgroud)
重复的行是:
date door …Run Code Online (Sandbox Code Playgroud) 似乎SQLPLUS以一种我没想到的方式显示了CLOB的空值和空字符串.
在SQLPLUS中尝试以下内容(我使用的是Oracle 10g服务器).创建一个包含CLOB的表,并插入null,空clob,以及我认为的空字符串:
create table tableA (field1 number, field2 clob);
insert into tableA values (1, null);
insert into tableA values (2, empty_clob());
insert into tableA values (3, '');
Run Code Online (Sandbox Code Playgroud)
好吧,让我们做一些查询,但首先我们需要告诉SQLPLUS为我们清楚地显示空值:
set null {NULL}
Run Code Online (Sandbox Code Playgroud)
对于以下查询,我原本只期望返回第1行,但它返回2:
select * from tableA where field2 is null;
field1 field 2
-----------------------
1 {NULL}
3 {NULL}
Run Code Online (Sandbox Code Playgroud)
嗯,所以''在CLOB中存储为null?
好的,基于该结果,我现在希望以下查询返回所有3行,但仅显示{NULL}在行1和3中.但是我得到了这个结果:
select * from tableA;
field1 field 2
-----------------------
1 {NULL}
2 {NULL}
3 {NULL}
Run Code Online (Sandbox Code Playgroud)
这令人困惑.我以为只有2个空值,即使我最初预期为1.那么这里发生了什么?是否set null为CLOB的不行,如果是的话我应该怎么用呢?
我实际上试图用空的CLOB值来解决一个不同的问题,但是这种令人困惑的行为让我运行了一段时间的响铃,所以我想在继续之前理解这一点.
提前致谢
博兹
我试过这个:
INSERT INTO tbl_vaucher
(
vaucher_name,
created_date
)
VALUES (
( SELECT TOP 1
con_full_name
FROM tbl_contact
),
GETDATE()
)
Run Code Online (Sandbox Code Playgroud)
,得到:Subqueries are not allowed in this context. Only scalar expressions are allowed.
我需要一个没有功能的解决方案.
我们可以在SQL Server 2005中的选择查询的条件中使用列号而不是列名,这样即使列名太长也是如此.
提前致谢.
我有一些数据,我没有组声明,并不希望有一个组声明.但我想有一个增量字段,所以我可以做一个报告服务斑马表.
那么,我该如何转换这些数据:
region country office somedata someotherdata
EUROPE Austria Vienna 12 2
ASIA India Delhi 22 4
Run Code Online (Sandbox Code Playgroud)
成
region country office somedata someotherdata IncField
EUROPE Austria Vienna 12 2 1
ASIA India Delhi 22 4 2
Run Code Online (Sandbox Code Playgroud) 说我有这三个表:
Table: Baskets
id | name
1 Sale
2 Premium
3 Standard
4 Expired
Table: Fruit
id | name | basketid
1 Apples 1
2 Oranges 2
3 Grapes 3
4 Apples 2
5 Apples 4
Table: Veggies
id | name | basketid
1 Carrots 1
2 Peas 2
3 Asparagus 1
Run Code Online (Sandbox Code Playgroud)
看起来后两个表应该只是一个称为Produce的表,但是在实际情况下,有充分的理由使它们成为不同的表。我需要编写一个联接,如果购物篮的水果表或蔬菜表中有行,则返回行。我以为我可以通过两个左连接来完成此操作,如下所示:
Select Baskets.*, fruit.name as fruit,
veggies.name as veggies
from Baskets
left join Fruit on Baskets.id = Fruit.basketid
left join veggies on Baskets.id = Veggies.basketid
where Baskets.id = …Run Code Online (Sandbox Code Playgroud) 我有这样的重复
col1, col2
1, alex
1, alex
2, liza
2, liza
3, peter
3, peter
Run Code Online (Sandbox Code Playgroud)
每个只有两个.我该如何删除重复项?
sql ×9
mysql ×4
sql-server ×3
clob ×1
csv ×1
filter ×1
group-concat ×1
indexing ×1
null ×1
optimization ×1
oracle ×1
performance ×1
postgresql ×1
sqlplus ×1
t-sql ×1