在mysqli查询中将一行划分为2行

时间:2013-10-10 22:35:34

标签: php mysqli

我正在为一个基于我的国家/地区的多个州的网站编写菜单,并且每个州都有许多城市。

在代码中一切都运行良好..但我被要求在菜单中“分割”一个状态,分为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 }?>

2 个答案:

答案 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查询并按州首先排序,则可以在单个查询中完成所有这些操作。我上面概述的相同技术将用于循环遍历状态,终止当前菜单并在每次找到新状态时开始新菜单。