我使用以下列运行了mill嵌套集层次结构类型设置:
表名:
myset
Run Code Online (Sandbox Code Playgroud)
列:
id, name, lft, rgt
Run Code Online (Sandbox Code Playgroud)
有没有人知道查询来确定节点的父节点?
我读了几个地方,在你的表中有一个parent_id列来跟踪这个很方便,但它似乎是多余的,如果在添加/时查询被错误地执行,它似乎可能与嵌套集不同步移除/移动集合中的任何内容.
我想知道查询的性能如何使用LIKE关键字和通配符作为与没有where子句的值相比较.
考虑一个where子句,例如"WHERE a LIKE'%'".这将匹配列'a'的所有可能值.这与没有where子句相比如何.
我问这个的原因是我有一个应用程序,其中有一些字段,用户可以指定要搜索的值.在某些情况下,用户希望获得所有可能的结果.我目前正在使用这样的单个查询:
SELECT * FROM TableName WHERE a LIKE ? AND b LIKE ?
Run Code Online (Sandbox Code Playgroud)
可以提供'%'和'%'的值以匹配a和or b的所有可能值.这很方便,因为我可以在我的应用程序中使用单个命名查询.我想知道性能考虑因素是什么.查询优化器是否会将LIKE'%'简化为全部匹配?我意识到因为我正在使用命名查询(预备语句),这也可能影响答案.我意识到答案可能是数据库特定的.具体来说,这将如何在Oracle,MS SQL Server和Derby中发挥作用.
另一种方法是根据用户输入通配符使用3个单独的查询.
A是通配符查询:
SELECT * FROM TableName WHERE b LIKE ?
Run Code Online (Sandbox Code Playgroud)
B是通配符查询:
SELECT * FROM TableName WHERE a LIKE ?
Run Code Online (Sandbox Code Playgroud)
A和B是通配符:
SELECT * FROM TableName
Run Code Online (Sandbox Code Playgroud)
没有通配符:
SELECT * FROM TableName WHERE a LIKE ? AND b LIKE ?
Run Code Online (Sandbox Code Playgroud)
显然,单个查询是最简单和最容易维护的.如果性能仍然良好,我宁愿只使用一个查询.
这可能比我做的更容易,但基本上我需要做的是选择列中具有最接近数字的行作为指定值.例如:
数据库中指定列中3行的值列表:10,15,16
如果我指定我想要最接近14的行,它将选择15行.
此外,如果有2行以上的距离相同,则随机选择其中一行.
作为Postgresql的新手(我正在移动,因为我正在将我的网站移动到只支持它的heroku,我不得不重构我的一些查询和代码.这是一个我无法理解这个问题的问题有:
PGError: ERROR: column "l_user_id" does not exist
LINE 1: ...t_id where l.user_id = 8 order by l2.geopoint_id, l_user_id ...
^
Run Code Online (Sandbox Code Playgroud)
...查询:
select distinct
l2.*,
l.user_id as l_user_id,
l.geopoint_id as l_geopoint_id
from locations l
left join locations l2 on l.geopoint_id = l2.geopoint_id
where l.user_id = 8
order by l2.geopoint_id, l_user_id = l2.user_id desc
Run Code Online (Sandbox Code Playgroud)
添加了"l.user_id为l_user_id,l.geopoint_id为l_geopoint_id"的子句,因为显然postgres不喜欢未选中字段的order子句.但是我现在得到的错误使它看起来像我也没有得到别名.任何有postgres经验的人都会看到问题吗?
我可能会遇到一堆这样的问题 - 查询在mySql中运行良好...
有没有办法在GROUP BY查询中包含LIKE表达式?例如:
SELECT Count(*)
FROM tblWhatever
GROUP BY column_x [LIKE %Fall-2009%]
Run Code Online (Sandbox Code Playgroud)
column_x:
--------
BIOL-Fall_2009
HIST Fall_2009
BIOL Spring_2009
Run Code Online (Sandbox Code Playgroud)
结果:
------
Fall_2009 2
Spring_2009 1
Run Code Online (Sandbox Code Playgroud) 我想知道是否有一些方法可以在MYSQL中执行不等于命令.换句话说,你可以这样做一个命令:"SELECT*FROM someTitle WHERE someLabel!='something'"?我尝试这个时,我的代码返回错误.
谢谢你的帮助!
我想做一些快速插入,但避免重复到表中.为了论证,我们称之为MarketPrices,我一直在尝试两种方法,但不确定如何更快地进行基准测试.
INSERT INTO MarketPrices (SecurityCode, BuyPrice, SellPrice, IsMarketOpen)
SELECT @SecurityCode, @BuyPrice, @SellPrice, @IsMarketOpen
EXCEPT
SELECT SecurityCode, BuyPrice, SellPrice, j.bool as IsActive FROM MarketPrices
CROSS JOIN (SELECT 0 as bool UNION SELECT 1 as bool ) as j
Run Code Online (Sandbox Code Playgroud)
要么
DECLARE @MktId int
SET @MktId = (SELECT SecurityId FROM MarketPrices
where SecurityCode = @SecurityCode
and BuyPrice=@BuyPrice
and SellPrice = @SellPrice)
IF (@MktId is NULL)
BEGIN
INSERT INTO MarketPrices (SecurityCode, BuyPrice, SellPrice, IsMarketOpen)
VALUES
(@SecurityCode,@BuyPrice, @SellPrice, @IsMarketOpen)
END
Run Code Online (Sandbox Code Playgroud)
假设这@whatever是存储过程中的输入参数.
我希望能够在BuyPrice或SellPrice或两者与之前的其他所有事件不同时为每个SecurityCode插入新记录.我不关心IsMarketOpen.
关于上述任何一种方法,有什么明显的愚蠢之处吗?一个比另一个快吗?
我需要更新Oracle数据库中的现有约束以在那里添加新列.
ALTER TABLE MY_PARTNER_DETAILS
MODIFY CONSTRAINT UQ_MY_PARTNER_DETAILS
UNIQUE(PARTNER_CODE,PGOOD_CODE,SITE_CODE,PARTNER_PLACEMENT,PARTNER_PARTICIPATION)
Run Code Online (Sandbox Code Playgroud)
给出错误:
Error at line 1
ORA-00933: SQL command not properly ended
Run Code Online (Sandbox Code Playgroud)
有什么问题?
我经常看到像这样编写SQL的人:
SELECT * from TableA LEFT OUTER JOIN TableB ON (ID1=I2)
Run Code Online (Sandbox Code Playgroud)
我自己写的很简单:
SELECT * from TableA LEFT JOIN TableB ON (ID1=I2)
Run Code Online (Sandbox Code Playgroud)
对我来说,"OUTER"关键字就像线路噪音一样 - 它不会增加额外的信息,只会使SQL混乱.在我所知道的大多数RDBMS中它甚至是可选的.那么......人们为什么还要写呢?这是习惯吗?可移植性?(你的SQL是否真的可移植?)还有其他我不知道的东西?
在PHP中,我想使用包含在字段/值对的关联数组中的数据插入到数据库中.
例:
$_fields = array('field1'=>'value1','field2'=>'value2','field3'=>'value3');
Run Code Online (Sandbox Code Playgroud)
生成的SQL插入应如下所示:
INSERT INTO table (field1,field2,field3) VALUES ('value1','value2','value3');
Run Code Online (Sandbox Code Playgroud)
我想出了以下PHP单行代码:
mysql_query("INSERT INTO table (".implode(',',array_keys($_fields)).") VALUES (".implode(',',array_values($_fields)).")");
Run Code Online (Sandbox Code Playgroud)
它分离关联数组的键和值,并implodes生成逗号分隔的字符串.问题是它不会转义或引用插入数据库的值.为了说明危险,想象一下如果$_fields包含以下内容:
$_fields = array('field1'=>"naustyvalue); drop table members; --");
Run Code Online (Sandbox Code Playgroud)
将生成以下SQL:
INSERT INTO table (field1) VALUES (naustyvalue); drop table members; --;
Run Code Online (Sandbox Code Playgroud)
幸运的是,不支持多个查询,但引用和转义对于防止SQL注入漏洞至关重要.
你如何编写PHP Mysql插件?
注意:PDO或mysqli的准备查询当前不适合我的选择,因为代码库已经使用广泛的MySQL - 改变计划,但它会采取很多资源的转换?
sql ×10
mysql ×4
sql-server ×3
oracle ×2
alias ×1
constraints ×1
derby ×1
equals ×1
heroku ×1
hierarchy ×1
nested-sets ×1
ora-00933 ×1
php ×1
postgresql ×1
select ×1
sql-like ×1
syntax ×1
t-sql ×1