使用ORDER BY

时间:2015-05-21 09:48:23

标签: php mysql sql sql-order-by

SELECT item_name, alt_names 
FROM antidepressants 
WHERE status = 'verified' 
ORDER BY priority, item_name

我在PHP中使用上述查询根据优先级对列进行排序,优先级设置为1-6,其余记录设置为优先级1000。

这是表格的一个例子

item_name   alt_name    priority
a           null        1000
b           null        1000
c           null        1000
d           null        1000
e           null        1000
x           f,g         1
y           h           2
z           null        3

我希望的是以下

x
y
z
a
b
c
d
e
f
g
h

但是因为alt_names列共享item_name的优先级,所以它就像这样

x
f
g
y
h
z
a
b
c
d
e

似乎我需要一种方法来执行两个查询,然后在一个查询中组合。我不想再进行两次单独的查询,然后使用php来组合它们。

编辑:我的PHP代码处理分隔

function populateAutocomplete()
{
    $query       = "SELECT item_name, alt_names FROM antidepressants WHERE status = 'verified' ORDER BY priority, item_name";
    $result_conn = conn($query);

    $autocomplete = array();
    if ($result_conn[0]->num_rows > 0) {
        while ($row = $result_conn[0]->fetch_assoc()) {
            $altnames = explode(",", $row['alt_names']);
            //var_dump($altnames);
            array_push($autocomplete, $row['item_name']);
            $autocomplete = array_merge($autocomplete, $altnames);
            }
        } 
    else {
        echo "0 results";
    }
    $result_conn[1]->close();
    foreach($autocomplete as &$val) {
        $val = trim($val);
    }
    $autocomplete = array_filter($autocomplete);
    $implode  = implode(",", $autocomplete);
    echo $implode;
}

3 个答案:

答案 0 :(得分:1)

不幸的是,您提出的问题比修复表定义更麻烦。任何时候你认为逗号分隔字段是一个好主意,提醒自己它真的不是,你应该规范你的表。

而不是表中的替代名称列表,您应该拥有的是第二个表,纯粹用于替代名称。例如:

create table alternative_names (
       item_name varchar(25),
       alt_name varchar(25)
);

使用这样的表格构建UNION查询以获得所需结果是一件简单的事情。在这里,我们为所有替代名称分配默认优先级1000:

select * from (
  SELECT item_name, priority
    from antidepressants
  UNION ALL
  SELECT alt_name, 1000
    from alternative_names
  ) q
order by priority asc, item_name asc;

这是here

的演示

鉴于您无法事先知道单个表中有多少个替代名称,因此没有一个简单的查询能够满足您的需求。

答案 1 :(得分:1)

就像我在评论中说的那样,我不是Php专家(我更喜欢C#+ SQL),但我知道逻辑,我认为这就是你需要的东西:

function populateAutocomplete()
{
    $query       = "SELECT item_name, alt_names FROM antidepressants WHERE status = 'verified' ORDER BY priority, item_name";
    $result_conn = conn($query);

    $autocomplete = array();
    if ($result_conn[0]->num_rows > 0) {
        while ($row = $result_conn[0]->fetch_assoc()) { //While to add item_name to array
            array_push($autocomplete, $row['item_name']);
            }
            $row = 0;
        while ($row = $result_conn[0]->fetch_assoc()) { //while to add alt_names to end of array
            $altnames = explode(",", $row['alt_names']);
            //var_dump($altnames);
            $autocomplete = array_merge($autocomplete, $altnames);
        }

        } 

    else {
        echo "0 results";
    }
    $result_conn[1]->close();
    foreach($autocomplete as &$val) {
        $val = trim($val);
    }
    $autocomplete = array_filter($autocomplete);
    $implode  = implode(",", $autocomplete);
    echo $implode;

答案 2 :(得分:-1)

由于您的示例显示1000排在2之上,我认为priorityvarchar列。

将其转换为int以进行排序将产生更好的结果:

order by cast(priority as int), item_name