Php SQL查询多where子句优先级
我有以下SQL查询Php SQL查询多where子句优先级,php,mysql,sql,Php,Mysql,Sql,我有以下SQL查询 SELECT * FROM train_stop where code='ABC' OR code='XYZ' OR code='DEF' group by number order by departs 现在,因为我使用了分组方式,所以只取一行特定的数字。但我想优先考虑结果。这意味着如果我的表有code='ABC'和code='XYZ',那么结果必须选择ABC行,而不是'XYZ',因为ABC在where子句中位于第一位。同样,如果表中有相同数字的XYZ和DEF,则结果中必
SELECT * FROM train_stop where code='ABC' OR code='XYZ' OR code='DEF' group by number order by departs
现在,因为我使用了
分组方式
,所以只取一行特定的数字。但我想优先考虑结果。这意味着如果我的表有code='ABC'和code='XYZ',那么结果必须选择ABC
行,而不是'XYZ',因为ABC在where子句中位于第一位。同样,如果表中有相同数字的XYZ
和DEF
,则结果中必须出现XYZ
,而不是DEF
。到目前为止,我的实验告诉我,它是随机发生的。如果您能指导我为这个案例实现这一正确的索引策略,我会很有帮助。谢谢
create语句如下所示:
Create Statement is `CREATE TABLE `train_stop` (
`number` varchar(1000) NOT NULL,
`stop_number` int(11) NOT NULL,
`code` varchar(1000) NOT NULL,
`station name` varchar(1000) NOT NULL,
`arrives` time NOT NULL,
`departs` time NOT NULL,
`halt` varchar(1000) NOT NULL,
`pf` varchar(1000) NOT NULL,
`day` int(11) NOT NULL,
`km` varchar(1000) NOT NULL,
`speed` varchar(1000) NOT NULL,
`elev` varchar(1000) NOT NULL,
`zone` varchar(1000) NOT NULL,
`address` varchar(1000) NOT NULL,
`active` int(11) DEFAULT '1',
KEY `index_1` (`number`(767),`code`(767)),
KEY `PIndex` (`number`(767),`stop_number`),
KEY `three_columns_idx` (`code`(767),`active`,`departs`),
KEY `two_columns_idx` (`code`(767),`active`),
KEY `two_columns_group_idx` (`number`(767),`departs`),
KEY `one_columns_group_idx` (`departs`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1`
试试这个
SELECT *
FROM train_stop
where code='ABC'
OR ( code != 'ABC'
and code = 'XYZ' )
OR ( code != 'ABC'
and code != 'XYZ'
and code='DEF' )
group by number
order by departs
试试这个
SELECT *
FROM train_stop
where code='ABC'
OR ( code != 'ABC'
and code = 'XYZ' )
OR ( code != 'ABC'
and code != 'XYZ'
and code='DEF' )
group by number
order by departs
试试这个
SELECT *
FROM train_stop
where code='ABC'
OR ( code != 'ABC'
and code = 'XYZ' )
OR ( code != 'ABC'
and code != 'XYZ'
and code='DEF' )
group by number
order by departs
试试这个
SELECT *
FROM train_stop
where code='ABC'
OR ( code != 'ABC'
and code = 'XYZ' )
OR ( code != 'ABC'
and code != 'XYZ'
and code='DEF' )
group by number
order by departs
分组方式是错误的。这就行了。无论何时更改要检查的代码,您都需要更改
order by
部分,以匹配您的where
子句顺序
select * from (
select if(@prev = number, @rank := @rank + 1, @rank := 1 and @prev := number) rank,
train_stop.*
from train_stop, (select @prev := 0, @rank := 1) q
where code = 'abc'
or code = 'xyz'
or code = 'def'
order by number asc, code='abc' desc, code='xyz' desc, code='abc' desc
) q where rank = 1;
此处演示:
此查询为每个有序组分配一个排名,然后从每个组中仅选择排名靠前的值。如果你有一个站号0,可能会断开。分组方式是错误的。这就行了。无论何时更改要检查的代码,您都需要更改
order by
部分,以匹配您的where
子句顺序
select * from (
select if(@prev = number, @rank := @rank + 1, @rank := 1 and @prev := number) rank,
train_stop.*
from train_stop, (select @prev := 0, @rank := 1) q
where code = 'abc'
or code = 'xyz'
or code = 'def'
order by number asc, code='abc' desc, code='xyz' desc, code='abc' desc
) q where rank = 1;
SELECT * FROM (SELECT * FROM train_stop where code='ABC' OR code='XYZ' OR
code='DEF' order by departs ASC) as t group by t.number
此处演示:
此查询为每个有序组分配一个排名,然后从每个组中仅选择排名靠前的值。如果你有一个站号0,可能会断开。分组方式是错误的。这就行了。无论何时更改要检查的代码,您都需要更改
order by
部分,以匹配您的where
子句顺序
select * from (
select if(@prev = number, @rank := @rank + 1, @rank := 1 and @prev := number) rank,
train_stop.*
from train_stop, (select @prev := 0, @rank := 1) q
where code = 'abc'
or code = 'xyz'
or code = 'def'
order by number asc, code='abc' desc, code='xyz' desc, code='abc' desc
) q where rank = 1;
SELECT * FROM (SELECT * FROM train_stop where code='ABC' OR code='XYZ' OR
code='DEF' order by departs ASC) as t group by t.number
此处演示:
此查询为每个有序组分配一个排名,然后从每个组中仅选择排名靠前的值。如果你有一个站号0,可能会断开。分组方式是错误的。这就行了。无论何时更改要检查的代码,您都需要更改
order by
部分,以匹配您的where
子句顺序
select * from (
select if(@prev = number, @rank := @rank + 1, @rank := 1 and @prev := number) rank,
train_stop.*
from train_stop, (select @prev := 0, @rank := 1) q
where code = 'abc'
or code = 'xyz'
or code = 'def'
order by number asc, code='abc' desc, code='xyz' desc, code='abc' desc
) q where rank = 1;
SELECT * FROM (SELECT * FROM train_stop where code='ABC' OR code='XYZ' OR
code='DEF' order by departs ASC) as t group by t.number
此处演示:
此查询为每个有序组分配一个排名,然后从每个组中仅选择排名靠前的值。如果您的电台号为0,则可能会中断。。。分组…从来都不是个好主意。除了
group by
中存在的值或聚合函数中使用的值外,其他值均不受保证。此问题与?如果你没有得到答案,试着更新/改进你的问题,而不是再次发布。乍一看,这个问题似乎是关于完全不同的事情。这一个是关于性能的,这一个是关于滥用组的“ABC在where子句中排名第一”这不是sql的工作方式它是mysql
还是sql server
?它们不一样。select*。。。分组…
从来都不是个好主意。除了group by
中存在的值或聚合函数中使用的值外,其他值均不受保证。此问题与?如果你没有得到答案,试着更新/改进你的问题,而不是再次发布。乍一看,这个问题似乎是关于完全不同的事情。这一个是关于性能的,这一个是关于滥用组的“ABC在where子句中排名第一”这不是sql的工作方式它是mysql
还是sql server
?它们不一样。select*。。。分组…
从来都不是个好主意。除了group by
中存在的值或聚合函数中使用的值外,其他值均不受保证。此问题与?如果你没有得到答案,试着更新/改进你的问题,而不是再次发布。乍一看,这个问题似乎是关于完全不同的事情。这一个是关于性能的,这一个是关于滥用组的“ABC在where子句中排名第一”这不是sql的工作方式它是mysql
还是sql server
?它们不一样。select*。。。分组…
从来都不是个好主意。除了group by
中存在的值或聚合函数中使用的值外,其他值均不受保证。此问题与?如果你没有得到答案,试着更新/改进你的问题,而不是再次发布。乍一看,这个问题似乎是关于完全不同的事情。这一个是关于性能的,这一个是关于滥用组的“ABC在where子句中排名第一”这不是sql的工作方式它是mysql
还是sql server
?它们不一样。这与第一个查询相同<代码>其中在组
之前计算,因此一次只计算一行。如果这能奏效,那只是巧合。在此处测试:要查看它是否失败,这与第一个查询相同<代码>其中在组
之前计算,因此一次只计算一行。如果这能奏效,那只是巧合。在此处测试:要查看它是否失败,这与第一个查询相同<代码>其中在组
之前计算,因此一次只计算一行。如果这能奏效,那只是巧合。在此处测试:要查看它是否失败,这与第一个查询相同<代码>其中在组
之前计算,因此一次只计算一行。如果这能奏效,那只是巧合。在这里测试:看看它失败了没有。这不是答案。它与原来的问题受到同一群体的虐待,除非是偶然的,否则不会给出正确的答案。这也不是同一个问题。你链接的是关于性能的,这是关于获得具体结果的。好吧,如果你是这么说的。但是试一下上面编辑过的答案
SELECT * FROM (SELECT * FROM train_stop where code='ABC' OR code='XYZ' OR
code='DEF' order by departs ASC) as t group by t.number