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;
}
答案 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
之上,我认为priority
是varchar
列。
将其转换为int以进行排序将产生更好的结果:
order by cast(priority as int), item_name