Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL查询多where子句优先级_Php_Mysql_Sql - Fatal编程技术网

Php SQL查询多where子句优先级

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,则结果中必

我有以下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
,则结果中必须出现
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