SQL Query多个where子句的优先级

时间:2015-04-29 04:26:22

标签: php mysql sql

我有以下SQL查询

SELECT * FROM train_stop where code='ABC' OR code='XYZ' OR code='DEF' group by number order by departs

现在因为我使用Group By以便只使用一行具有特定数字。但我想优先考虑结果。这意味着如果我的表格有代码=' ABC'和代码=' XYZ' ,那么结果必须选择ABC行而不是' XYZ'因为ABC在where子句中排在第一位。同样,如果表格的XYZDEF代码相同,则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`

3 个答案:

答案 0 :(得分:3)

分组是错误的方法。这样做。每当您更改要检查的代码时,您都需要更改df1 <- structure(list(ID = c("A", "", "B", ""), Changes = c("down from $20 to $10", "down from $11 to $10", "down from $13 to $12", "down from $15 to $12" )), .Names = c("ID", "Changes"), class = "data.frame", row.names = c(NA, -4L)) df2 <- data.frame(ID=c('A', 'B'), Changes=c('down from $20 to $10 down from $11 to $10', 'down from $13 to $12 down from $15 to $12'), stringsAsFactors=FALSE) 部分以匹配您的order by子句。

where

在这里演示:http://sqlfiddle.com/#!9/ccc4d/7

此查询为每个有序组分配一个等级,然后仅从每个组中选择排名最高的值。如果您的电台号码为0,可能会中断

答案 1 :(得分:0)

试试这个。

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

答案 2 :(得分:0)

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