我有一张用户表和一张投票表.投票表存储对其他用户的投票.无论好坏,投票表中的一行,都会在两个用户之间的两个方向上存储投票.
现在,问题在于我想列出一些人投票的所有人.
我不是MySQL的专家,但是根据我的想法,由于join语句中的OR条件,它需要查看整个 users表(目前是+44,000行),并创建一个临时表来做所以.
目前,bellow查询大约需要两分钟,是的,两分钟即可完成.如果我在join语句中删除OR条件及其后面的所有内容,它会在不到半秒的时间内运行,因为它只需要查看44,000个用户行中的大约17个(解释 ftw!).
下面的示例,用户ID是9834,我正在尝试获取他/她自己没有投票,并加入投票的用户的信息到结果.
是否有更好,更快的方法来执行此查询?或者我应该重组表格?我真的希望可以通过修改查询来修复它,因为表中已经有很多用户(+44,000)和投票(+130,000),我必须迁移它们.
谢谢 :)
SELECT *, votes.id as vote_id
FROM `votes`
LEFT JOIN users ON (
(
votes.user_id_1 = 9834
AND
users.uid = votes.user_id_2
)
OR
(
votes.user_id_2 = 9834
AND
users.uid = votes.user_id_1
)
)
WHERE (
(
votes.user_id_1 = 9834
AND
votes.vote_1 = 0
)
OR
(
votes.user_id_2 = 9834
AND
votes.vote_2 = 0
)
)
ORDER BY votes.updated_at DESC
LIMIT 0, 10
Run Code Online (Sandbox Code Playgroud) Php新手.
1.这个PHP和MySQL代码有什么问题吗?
include_once "db_login.php" ;
$sql = "DROP TEMPORARY TABLE IF EXISTS temp_sap_id_select" ;
mysql_query ( $sql ) or ( "Error " . mysql_error () ) ;
$sql = " CREATE TEMPORARY TABLE temp_sap_id_select
(
`current_page` INT NOT NULL,
`total_pages` INT NOT NULL,
`select_date` DATE NOT NULL,
`select_schcode` CHAR(6) NOT NULL,
`select_user` CHAR(30) NOT NULL,
`select_id` CHAR(9) NOT NULL
) " ;
mysql_query ( $sql ) or ( "Error " . mysql_error () ) ;
Run Code Online (Sandbox Code Playgroud)
2.不可否认,我是一个沉闷的男孩,但无论如何我会问:如果我使用MySQL GUI并打开目标数据库,它是否会知道PHP/MySQL创建的上述临时表(如果临时表是否正确创建)?
我在里面有以下内容package,它给了我一个错误:
ORA-14551: cannot perform a DML operation inside a query
Run Code Online (Sandbox Code Playgroud)
代码是:
DECLARE
CURSOR F IS
SELECT ROLE_ID
FROM ROLE
WHERE GROUP = 3
ORDER BY GROUP ASC;
BEGIN
FOR R IN F LOOP
DELETE FROM my_gtt_1;
COMMIT;
INSERT INTO my_gtt_1
( USER, role, code, status )
(SELECT
trim(r.user), r.role, r.code, MAX(status_id)
FROM
table1 r,
tabl2 c
WHERE
r.role = R.role
AND r.code IS NOT NULL
AND c.group = 3
GROUP BY
r.user, r.role, r.code);
SELECT c.role,
c.subgroup,
c.subgroup_desc, …Run Code Online (Sandbox Code Playgroud) 我和另一位开发人员正在讨论哪种类型的表更适合我们的任务.它基本上是一个缓存,我们将在一天结束时截断.就个人而言,我认为没有任何理由为此使用除普通表之外的任何东西,但他想使用全局临时表.
一个或另一个有什么好处吗?
我的计划是使用$ this-> Model-> query()创建一个临时表; 方法然后加载它作为模型,但我得到一个错误保持"缺少数据库表".将调试打开到第二级显示临时表已成功完全创建但由于某种原因,当我尝试将其作为模型加载时,它不起作用.看起来蛋糕甚至没有尝试查看表是否存在,因为没有显示"显示全部列..."查询.不确定如何强制蛋糕检查它的存在.
$tmpModel = 'tempModel';
$tmpTable = 'temp_models';
$this->Model->query('CREATE TEMPORARY TABLE `'.$tmpTable ... );
$this->loadModel($tmpModel);
Run Code Online (Sandbox Code Playgroud)
提前致谢.
(免责声明-我不是数据库设计师。我只是可怜的开发人员,必须做这项工作。)
目前有17个表格具有相同的结构-名称,地址,电话号码。
给定一个电话号码,我必须检查任何表中是否有匹配的条目,然后返回该地址。
因此,我创建了一个视图以获取表列表(有一个保存该信息的ref表),然后创建了一个存储过程来
所有这些都可以在直接的T-SQL中运行。
现在,我正在尝试使用Entity Framework 4+来调用存储过程。但是函数导入接口不会生成列。它说返回类型= none,并且LINQ代码期望一个int并且不会编译。
关于如何进行这项工作的任何想法?
我知道,如果绝对有必要,我可以将检查表部分移到代码中,但是我希望上面的方法可以工作。
Views和Temporary表的性能是否有任何重大差异.我有将数据从一个数据库迁移到另一个数据库的情况.我必须将视图中的源数据提取到目标数据库中的表.
由于其中没有唯一字段,我尝试将视图中的数据提取到临时表中,以及将数据推送到目标表的过程.我没有发现任何关于时间的重大性能变化.
关于mysql(5.1.36)中的完全加入有很多问题.当然,解决方案是join-union组合.
我的问题是我有两个这样的临时表:
CREATE TEMPORARY TABLE wConfs
(
idWorker INT,
confs SMALLINT
) ENGINE=INNODB;
CREATE TEMPORARY TABLE wRejects
(
idWorker INT,
rejects SMALLINT
) ENGINE=INNODB;
Run Code Online (Sandbox Code Playgroud)
JOIN-UNION mix不能用于完全连接临时表,因为它会导致ERROR 1137 (HY000): Can't reopen table.
我的问题是 - 什么是最简单的解决方案,以实现临时表的完全连接?
编辑:JOIN-UNION混合:
SELECT wc.idWorker, wc.confs, wr.rejects FROM wConfs wc LEFT JOIN wRejects wr
ON (wr.idWorker = wc.idWorker)
UNION
SELECT wc.idWorker, wc.confs, wr.rejects FROM wConfs wc RIGHT JOIN wRejects wr
ON (wr.idWorker = wc.idWorker);
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个接受两个输入(内容ID和内容类型)的SQL查询,根据用户设置的内容类型从不同的源表填充临时表,然后最终针对temp运行查询表.我想我会把我的临时表合并到我的IF/ELSE语句中.
所以我的问题是,为什么这会返回一些非零数量的结果:
DECLARE @contentID int, @contenttype varchar
SET @contentid = 28861
SET @contenttype = 'resource'
DECLARE @tags_current TABLE (contentID int, taxonomyID int, isPrimary int)
INSERT INTO @tags_current (contentID, taxonomyID, isPrimary)
SELECT resourceID as contentID, taxonomyID, isPrimary
FROM resource2taxonomy r2t
WHERE r2t.resourceID = @contentID
SELECT * FROM @tags_current
Run Code Online (Sandbox Code Playgroud)
而这会返回零结果:
DECLARE @contentID int, @contenttype varchar
SET @contentid = 28861
SET @contenttype = 'resource'
DECLARE @tags_current TABLE (contentID int, taxonomyID int, isPrimary int)
IF (@contenttype = 'resource')
BEGIN
INSERT INTO @tags_current (contentID, taxonomyID, …Run Code Online (Sandbox Code Playgroud) 用外行术语来说,WITH子句和临时表之间的主要区别是什么?
在哪种情况下最好使用一种?
temp-tables ×10
sql ×4
mysql ×3
sql-server ×3
join ×2
php ×2
cakephp ×1
database ×1
oracle ×1
performance ×1
plsql ×1
t-sql ×1
view ×1
with-clause ×1