在我正在创建的系统上工作时,我试图在我的项目中使用以下查询:
SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)
FROM topics
LEFT OUTER JOIN posts ON posts.topic_id = topics.id
WHERE topics.cat_id = :cat
GROUP BY topics.id
Run Code Online (Sandbox Code Playgroud)
":cat"由我的PHP代码绑定,因为我正在使用PDO.2是":cat"的有效值.
该查询虽然给我一个错误:"#1241 - 操作数应包含1列"
让我感到困惑的是,我认为这个查询没有问题.选择列,然后从另一个表中再选择两个,然后从那里继续.我只是无法弄清楚问题是什么.
是否有一个简单的解决方法,或其他方式来编写我的查询?
我正在尝试从表中获取ip,用户和最近的时间戳,该表可能包含用户的当前ip和一个或多个先前的ips.我想为每个用户提供一行,其中包含最新的ip和相关的时间戳.所以如果一个表看起来像这样:
username | ip | time_stamp
--------------|----------|--------------
ted | 1.2.3.4 | 10
jerry | 5.6.6.7 | 12
ted | 8.8.8.8 | 30
Run Code Online (Sandbox Code Playgroud)
我希望查询的输出是:
jerry | 5.6.6.7 | 12
ted | 8.8.8.8 | 30
Run Code Online (Sandbox Code Playgroud)
我可以在单个SQL查询中执行此操作吗?如果重要,DBMS就是Postgresql.
执行此代码时遇到问题:
SELECT * FROM tblpm n
WHERE date_updated=(SELECT MAX(date_updated)
FROM tblpm GROUP BY control_number
HAVING control_number=n.control_number)
Run Code Online (Sandbox Code Playgroud)
基本上,我想返回每个控制号的最新日期.上面的查询返回正确的输出,但需要37秒.在输出显示之前.
是否还有其他sql子句或命令可以比上面的查询执行得更快?
提前致谢.
我的数据看起来像这样:
entities
id name
1 Apple
2 Orange
3 Banana
Run Code Online (Sandbox Code Playgroud)
流程将定期运行并为每个实体提供分数.该过程生成数据并将其添加到分数表中,如下所示:
scores
id entity_id score date_added
1 1 10 1/2/09
2 2 10 1/2/09
3 1 15 1/3/09
4 2 10 1/03/09
5 1 15 1/4/09
6 2 15 1/4/09
7 3 22 1/4/09
Run Code Online (Sandbox Code Playgroud)
我希望能够选择所有实体以及每个实体的最新记录得分,从而产生如下数据:
entities
id name score date_added
1 Apple 15 1/4/09
2 Orange 15 1/4/09
3 Banana 15 1/4/09
Run Code Online (Sandbox Code Playgroud)
我可以使用此查询获取单个实体的数据:
SELECT entities.*,
scores.score,
scores.date_added
FROM entities
INNER JOIN scores
ON entities.id = scores.entity_id
WHERE entities.id = ? …
Run Code Online (Sandbox Code Playgroud) 我很欣赏数据库表中NULL值的语义含义,不同于false和空字符串''.但是,当字段可以为空时,我经常阅读有关性能问题的内容,并建议在NULL实际上在语义上正确的情况下使用空字符串.
什么情况适合使用可空字段和NULL值?有什么权衡取舍?简单地避免完全使用NULL并简单地使用空字符串,false或0表示缺少值是明智的吗?
UPDATE
好的 - 我理解'和NULL之间的语义差异以及NULL是适当的字段值的(性能不可知)情况.但是,让我扩展一下暗示的性能问题.这是来自Schwartz,Zeitsev等人的优秀"高性能MySQL" http://www.borders.co.uk/book/high-performance-mysql-optimization-backups-replication-and-more/857673/:
MySQL更难以优化引用可空库存的查询,因为它们使索引,索引统计和值比较更加复杂.可空列使用更多存储空间,并且需要在MySQL内部进行特殊处理.当索引可空列时,每个条目需要一个额外的字节,甚至可以在MyISAM中将固定大小的inded(例如单个整数列上的索引)转换为可变大小的列.
更多信息: Google图书预览
这很可能是明确的答案 - 我只是在寻找前线的第二意见和经验.
我们可以测试目录是否可由当前进程的uid写入:
if [ -w $directory ] ; then echo 'Eureka!' ; fi
Run Code Online (Sandbox Code Playgroud)
但是,有人可以建议一种方法来测试目录是否可由其他 uid 写入?
我的方案是我正在管理MySQL Server实例,我想暂时更改慢查询日志文件的位置.我可以通过执行MySQL命令SET GLOBAL slow_query_log_file='$new_log_filename'
,然后禁用和启用查询日志记录来mysqld
启动使用该文件.
但我希望我的脚本检查mysqld
进程的uid 是否有权创建新的日志文件.所以我想做一些像(伪代码)的东西:
$ if [ -w-as-mysql-uid `basename $new_log_filename` ] ; then echo 'Eureka!' ; fi
Run Code Online (Sandbox Code Playgroud)
但当然这是一个想象的测试谓词.
澄清: 我想要一个不依赖的解决方案,su
因为我无法假设我的脚本用户具有su特权.
不久前开始使用PDO准备好的语句,据我所知,它可以为您完成所有的转义/安全性.
例如,假设$ _POST ['title']是一个表单字段.
$title = $_POST['title'];
$query = "insert into blog(userID, title) values (?, ?)"
$st = $sql->prepare($query);
$st->bindParam(1, $_SESSION['user']['userID'], PDO::PARAM_INT);
$st->bindParam(2, $title);
$st->execute();
Run Code Online (Sandbox Code Playgroud)
这真的很安全吗?我还要做别的吗?还有什么需要考虑的?
谢谢.
当我使用Zend Framework的数据库组件时,我们尝试抽象LIMIT
MySQL,PostgreSQL和SQLite支持的子句的功能.也就是说,创建查询可以这样做:
$select = $db->select();
$select->from('mytable');
$select->order('somecolumn');
$select->limit(10, 20);
Run Code Online (Sandbox Code Playgroud)
当数据库支持时LIMIT
,这将生成如下SQL查询:
SELECT * FROM mytable ORDER BY somecolumn LIMIT 10, 20
Run Code Online (Sandbox Code Playgroud)
对于不支持的数据库品牌来说,这更复杂LIMIT
(顺便说一句,该子句不是标准SQL语言的一部分).如果可以生成行号,则将整个查询作为派生表,并在外部查询中使用BETWEEN
.这是Oracle和IBM DB2的解决方案.Microsoft SQL Server 2005具有类似的行号功能,因此可以这样编写查询:
SELECT z2.*
FROM (
SELECT ROW_NUMBER OVER(ORDER BY id) AS zend_db_rownum, z1.*
FROM ( ...original SQL query... ) z1
) z2
WHERE z2.zend_db_rownum BETWEEN @offset+1 AND @offset+@count;
Run Code Online (Sandbox Code Playgroud)
但是,Microsoft SQL Server 2000没有此ROW_NUMBER()
功能.
所以我的问题是,你能想出一种方法来模拟LIMIT
Microsoft SQL Server 2000中的功能,只使用SQL吗?不使用游标或T-SQL或存储过程.它必须支持LIMIT
count和offset 两个参数.使用临时表的解决方案也是不可接受的.
编辑:
MS SQL …
我认为一个外键意味着一行必须引用一行,但我正在看一些表肯定不是这样的表.Table1的column1在table2中的column2上有一个外键约束,但是table2中有许多记录在column2中有相同的值.column2上还有非唯一索引.这是什么意思?外键约束是否只是意味着在右列中必须存在至少一个具有正确值的记录?我认为这意味着必须有一个这样的记录(不确定空白如何适应图片,但我现在不太关心它).
更新:显然,这种行为是特定于MySQL,这是我正在使用的,但我没有在我原来的问题中提到它.
mysql ×7
sql ×6
bash ×1
date ×1
directory ×1
enums ×1
foreign-keys ×1
join ×1
null ×1
optimization ×1
pdo ×1
php ×1
postgresql ×1
security ×1
sql-server ×1