标签: sql

MySQL嵌套集 - 如何查找节点的父节点?

我使用以下列运行了mill嵌套集层次结构类型设置:

表名:

myset
Run Code Online (Sandbox Code Playgroud)

列:

id, name, lft, rgt
Run Code Online (Sandbox Code Playgroud)

有没有人知道查询来确定节点的节点?

我读了几个地方,在你的表中有一个parent_id列来跟踪这个很方便,但它似乎是多余的,如果在添加/时查询被错误地执行,它似乎可能与嵌套集不同步移除/移动集合中的任何内容.

mysql sql hierarchy nested-sets

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

SQL LIKE仅使用通配符(%)作为值的性能

我想知道查询的性能如何使用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)

显然,单个查询是最简单和最容易维护的.如果性能仍然良好,我宁愿只使用一个查询.

sql sql-server oracle derby sql-like

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

使用MySQL查询选择最接近的数值

这可能比我做的更容易,但基本上我需要做的是选择列中具有最接近数字的行作为指定值.例如:

数据库中指定列中3行的值列表:10,15,16

如果我指定我想要最接近14的行,它将选择15行.

此外,如果有2行以上的距离相同,则随机选择其中一行.

mysql sql

11
推荐指数
1
解决办法
1万
查看次数

postgres列别名问题

作为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中运行良好...

mysql sql postgresql alias heroku

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

T-SQL - LIKE的GROUP BY - 这可能吗?

有没有办法在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)

sql t-sql sql-server

11
推荐指数
1
解决办法
3万
查看次数

在SQL中不等于

我想知道是否有一些方法可以在MYSQL中执行不等于命令.换句话说,你可以这样做一个命令:"SELECT*FROM someTitle WHERE someLabel!='something'"?我尝试这个时,我的代码返回错误.

谢谢你的帮助!

mysql sql select equals

11
推荐指数
3
解决办法
1万
查看次数

SQL INSERT但避免重复

我想做一些快速插入,但避免重复到表中.为了论证,我们称之为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.

关于上述任何一种方法,有什么明显的愚蠢之处吗?一个比另一个快吗?

sql sql-server sql-server-2005

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

修改Oracle中的唯一约束

我需要更新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 oracle constraints ora-00933

11
推荐指数
1
解决办法
3万
查看次数

在SQL中编写左/右JOIN时是否使用OUTER关键字?

我经常看到像这样编写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是否真的可移植?)还有其他我不知道的东西?

sql syntax rdbms-agnostic

11
推荐指数
2
解决办法
2506
查看次数

如何使用关联数组编写好的PHP数据库插入

在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 - 改变计划,但它会采取很多资源的转换?

php sql associative-array

11
推荐指数
1
解决办法
1万
查看次数