Php 在mysqli查询中将一行分成两行
嗨,我在为一个网站写菜单,这个网站基于我的国家有多个州,每个州有很多城市 在代码中,一切都运行良好。。但我被要求将菜单中的一个状态“划分”为两个状态,例如“状态1 A-L”和“状态1 M-Z” 我的第一个想法是在DB中创建两个状态,所以就像我将创建这两个状态一样简单。但是,在所有的站点中,我会有2个状态,而不是1个,就像它应该的那样 所以我认为一定有办法做到这一点。。如果没有,我将不得不做一个HTML菜单,然后只是手动更新,这很糟糕。如果菜单根据查询自动更新会更好 这是我的代码和查询:状态的顺序,只是为了得到我需要的2列菜单。但我如何才能“分裂”或“分裂”一个州,使之成为两个州呢Php 在mysqli查询中将一行分成两行,php,mysqli,Php,Mysqli,嗨,我在为一个网站写菜单,这个网站基于我的国家有多个州,每个州有很多城市 在代码中,一切都运行良好。。但我被要求将菜单中的一个状态“划分”为两个状态,例如“状态1 A-L”和“状态1 M-Z” 我的第一个想法是在DB中创建两个状态,所以就像我将创建这两个状态一样简单。但是,在所有的站点中,我会有2个状态,而不是1个,就像它应该的那样 所以我认为一定有办法做到这一点。。如果没有,我将不得不做一个HTML菜单,然后只是手动更新,这很糟糕。如果菜单根据查询自动更新会更好 这是我的代码和查询:状态的顺序
<?php
$result = mysqli_query($con ,"SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
$result = mysqli_query($con,"SELECT * FROM table_states WHERE ccode='MX' Order by find_in_set(scode, '01,17,02,18,03,19,04,20,05,21,06,22,07,23,08,24,09,25,10,26,11,27,12,28,13,29,14,30,15,31,33,32,16')");
while($row = mysqli_fetch_array($result))
{?>
<li class="menuin<?php echo $row['sname'];?>"><a class="st" href="javascript:void(0);"><?php echo $row['sname'];?></a>
<ul class="ulCityDN<?php echo $row['sname'];?>" id="menusub<?php echo $row['sname'];?>">
<?php $resultSub = mysqli_query($con,"SELECT * FROM `table_cities` where ccode='$row[ccode]' and scode='$row[scode]' limit 0,30");
//echo "SELECT * FROM `table_cities` where ccode='$row[ccode]' and scode='$row[scode]' limit 0,30";
while($rowSub = mysqli_fetch_array($resultSub)){
?>
<li><a href="index.php?page=location/change-city/<?php echo $rowSub['id'];?>&<?php echo $row['scode'];?>&city=<?php echo $rowSub['city'];?>"><?php echo $rowSub['city'];?></a></li>
<?php }?>
</ul>
</li>
<?php }
?>
</ul>
</div>
</div>
</div>
<?php }?>
第一个查询可以是我发布的联合查询。可能是这样的:
(
SELECT
(
CASE WHEN sname = 'State 1' THEN 'State 1 A-L'
ELSE sname
END
) AS sname,
ccode,
scode
FROM table_states
WHERE ccode='MX'
)
UNION
(
SELECT
'State 1 M-Z' AS sname,
'01' AS ccode, /* ccode from State 1 */
'02' AS scode /* scode from State 1 */
)
Order by find_in_set(scode, '01,17,02,18,03,19,04,20,05,21,06,22,07,23,08,24,09,25,10,26,11,27,12,28,13,29,14,30,15,31,33,32,16')
我没有测试案例/WHEN
。但它应该将state1
重命名为state1a-L
。第二个查询只返回硬编码的值。在这里,您可以为状态1 M-Z
硬编码其他ccode或scode。然后你必须在城市数据库中更改它
另一个想法是在PHP中为城市创建条件:
if ($row['sname'] == 'State 1 A-L') {
$sql = "
SELECT * FROM `table_cities`
where ccode='$row[ccode]'
and scode='$row[scode]'
AND city < 'M' limit 0,30";
}
else if ($row['sname'] == 'State 1 M-Z') {
$sql = "
SELECT * FROM `table_cities`
where ccode='$row[ccode]'
and scode='$row[scode]'
AND city > 'L' limit 0,30";
}
else {
$sql = "
SELECT * FROM `table_cities`
where ccode='$row[ccode]'
and scode='$row[scode]' limit 0,30";
}
if($row['sname']=='state1a-L'){
$sql=”
从“表”中选择*城市`
其中ccode='$row[ccode]'
和scode='$row[scode]'
以及城市<'M'限值0,30”;
}
else if($row['sname']=='State 1 M-Z'){
$sql=”
从“表”中选择*城市`
其中ccode='$row[ccode]'
和scode='$row[scode]'
和城市>'L'限值0,30”;
}
否则{
$sql=”
从“表”中选择*城市`
其中ccode='$row[ccode]'
而scode=“$row[scode]”限制为0,30”;
}
第一个查询可以是我发布的联合查询。可能是这样的:
(
SELECT
(
CASE WHEN sname = 'State 1' THEN 'State 1 A-L'
ELSE sname
END
) AS sname,
ccode,
scode
FROM table_states
WHERE ccode='MX'
)
UNION
(
SELECT
'State 1 M-Z' AS sname,
'01' AS ccode, /* ccode from State 1 */
'02' AS scode /* scode from State 1 */
)
Order by find_in_set(scode, '01,17,02,18,03,19,04,20,05,21,06,22,07,23,08,24,09,25,10,26,11,27,12,28,13,29,14,30,15,31,33,32,16')
我没有测试案例/WHEN
。但它应该将state1
重命名为state1a-L
。第二个查询只返回硬编码的值。在这里,您可以为状态1 M-Z
硬编码其他ccode或scode。然后你必须在城市数据库中更改它
另一个想法是在PHP中为城市创建条件:
if ($row['sname'] == 'State 1 A-L') {
$sql = "
SELECT * FROM `table_cities`
where ccode='$row[ccode]'
and scode='$row[scode]'
AND city < 'M' limit 0,30";
}
else if ($row['sname'] == 'State 1 M-Z') {
$sql = "
SELECT * FROM `table_cities`
where ccode='$row[ccode]'
and scode='$row[scode]'
AND city > 'L' limit 0,30";
}
else {
$sql = "
SELECT * FROM `table_cities`
where ccode='$row[ccode]'
and scode='$row[scode]' limit 0,30";
}
if($row['sname']=='state1a-L'){
$sql=”
从“表”中选择*城市`
其中ccode='$row[ccode]'
和scode='$row[scode]'
以及城市<'M'限值0,30”;
}
else if($row['sname']=='State 1 M-Z'){
$sql=”
从“表”中选择*城市`
其中ccode='$row[ccode]'
和scode='$row[scode]'
和城市>'L'限值0,30”;
}
否则{
$sql=”
从“表”中选择*城市`
其中ccode='$row[ccode]'
而scode=“$row[scode]”限制为0,30”;
}
为什么不在您的表\u cities
查询中按城市下单?然后,您可以对城市名称是否以某个字母开头进行简单检查。传递该字母后,终止当前子菜单并开始在新的子菜单中写入
另一方面,如果您将table_states
加入到table_cities
查询中,并首先按州排序,那么您可以在一个查询中完成所有这一切。我上面概述的相同技术也适用于循环状态、终止当前菜单并在每次发现新状态时启动新菜单。为什么不在表\u cities
查询中仅按城市
排序?然后,您可以对城市名称是否以某个字母开头进行简单检查。传递该字母后,终止当前子菜单并开始在新的子菜单中写入
另一方面,如果您将table_states
加入到table_cities
查询中,并首先按州排序,那么您可以在一个查询中完成所有这一切。我上面概述的相同技术也适用于循环状态、终止当前菜单并在每次发现新状态时启动新菜单。这是一个好问题。如果不改变数据库,这将不容易解决。您可以执行UNION
查询,将两个状态都输入第一个结果。但这些城市都是指同一个州。因此,你必须更改城市的ccode或scode,或者在查询时执行大量的CASE
操作。好的,联合部分听起来很有趣,请看一看,你提到的第二个问题,我需要为第一个州划分类别divide a-l,所以这里只有A到L的城市应该在第一部分,只是我对工会一无所知,这是个好问题。如果不改变数据库,这将不容易解决。您可以执行UNION
查询,将两个状态都输入第一个结果。但这些城市都是指同一个州。因此,你必须更改城市的ccode或scode,或者在查询时执行大量的CASE
操作。好的,联合部分听起来很有趣,请看一看,你提到的第二个问题,我需要为第一个州划分类别divide a-l,所以这里只有A到L的城市应该在第一个“片段”中,只是我对unionWell一无所知,因为如果我这样做的话,2列与设计师和客户设定的顺序不匹配。。这就是为什么我把你的想法(那是第一个模型)改为这个。。正如我所说,我需要将一个状态“划分”为两个,但在查询中。。。。因为在网站内“分类”、“新闻”、“论坛”的所有内容,必须只给我一个状态(在菜单中划分的状态)…好吧,因为如果我这样做的话,这两列不符合设计师和客户设定的顺序。。这就是为什么我把你的想法(那是第一个模型)改为这个。。正如我所说,我需要“划分”一个sta