我正在为一个基于我的国家/地区的多个州的网站编写菜单,并且每个州都有许多城市。
在代码中一切都运行良好..但我被要求在菜单中“分割”一个状态,分为2个状态,例如“状态1 AL”然后“状态1 M - Z”
我的第一个想法是在DB中创建两个状态,所以就像我将创建两个状态一样简单。但是,然后在所有网站内我将有2个状态而不是1个,就像它应该的那样。
所以我认为必须有一种方法可以做到这一点。如果不是,我将不得不做一个HTML菜单,然后只需手动更新它,这很糟糕。如果菜单根据查询自动更新...
会更好这是我的代码和查询:状态的顺序,只是为了得到我需要的2列菜单。但是,我怎样才能“分裂”或“分裂”一个国家并使其成为两个?
<?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 }?>
答案 0 :(得分:1)
第一个查询可能是我发布的UNION
查询。它可能是这样的:
(
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')
我没有测试CASE/WHEN
。但它应该将State 1
重命名为State 1 A-L
。第二个查询仅返回硬编码值。在这里,您可以对State 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";
}
答案 1 :(得分:0)
为什么不在city
查询中按table_cities
排序?然后,您可以执行一个简单的检查,以确定城市名称是否以某个字母开头。一旦你传递了这封信,就终止当前的子菜单并开始写一个新的子菜单。
另外,如果您将table_states
加入table_cities
查询并按州首先排序,则可以在单个查询中完成所有这些操作。我上面概述的相同技术将用于循环遍历状态,终止当前菜单并在每次找到新状态时开始新菜单。