如何使用mySQL和PHP实现这种排序?

时间:2012-04-18 23:32:37

标签: php mysql

我将此表命名为“categories”,其中包含以下三个字段

cat     | order | id
--------|-------|----
News    |  3    | 23
Hi-Tech |  2    | 15
Biz     |  5    | 8
Health  |  1    | 3

另外,我还有另一个名为“links”的表,如下所示

link    | order | cat-id
--------|-------|-------
link1   |  2    | 23
link2   |  8    | 15
link3   |  5    | 8
link4   |  6    | 15
link5   |  2    | 15
link6   |  4    | 23
link7   |  1    | 3
link8   |  1    | 8

我想要实现的是对类别进行排序,并在每个类别下方对该类别的链接进行排序 cat-id / id 以下是:

健康
link7

高科
link5
LINK4
LINK2

新闻
链接1
link6

商务
LINK8
LINK3

我成功地显示类别已排序,但我在它之后将其丢失。

我的目标是在页面上显示这个,所以我想我必须使用PHP和mySQL。

10 个答案:

答案 0 :(得分:16)

查询就是这样:

SELECT c.cat, l.link, c.id
FROM links l INNER JOIN categories c
ON l.cat-id = c.id
ORDER BY c.`order`, l.`order`

here it is at work

为了在页面上显示它,它看起来像这样:

mysql_connect(<host>, <username>, <password>);

$q = mysql_query("<query from above>");
$last_cat = 0;
while($row = mysql_fetch_assoc($q)) {
    if($row['id'] != $last_cat) {
        print '<h3>' . $row['cat'] . '</h3>';
        $last_cat = $row['id'];
    }
    print $row['link'] . '<br>';
}

答案 1 :(得分:5)

我在脑海里写了这个,所以没有测试它,但它有点像这样:

$q = mysql_query("select * from categories c 
      left join links l 
      on l.cat-id=c.id 
      order by c.order,l.order");

$last_cat = -1;

while($row=mysql_fetch_assoc($q)){
    if($last_cat!=$row["cat"]){
        echo "<br><b>".$row["cat"]."</b><br>";
        $last_cat=$row["cat"];
    }
    echo $row["link"]."<br>";
}

答案 2 :(得分:2)

这将完全按照示例中所述进行打印:

<?php
$categories = mysql_query("SELECT * FROM categories order by 'order'");
$links = mysql_query("SELECT * FROM links order by 'order'"); 
?>

<?php foreach ($categories as $key => $category): ?>
 <b><?php echo $category['cat'];?>"</b>
    <?php foreach ($links as $key => $link): ?>
      <?php if($category['id'] === $link['cat-id']): ?>
         <?php echo $link['link'];?>
      <?php endif;?>
    <?php endforeach;?>
   <br />
<?php endforeach;?>

答案 3 :(得分:2)

<?php
// This query gets all the needed data with one shot. No need to do multiple
// queries. You can run this query in phpMyAdmin to see the result.
$query = mysql_query("
    SELECT links.link as link, categories.cat as cat FROM links
    LEFT JOIN categories ON categories.id = links.cat_id
    ORDER BY categories.order, links.order ASC");

// With this we are getting all links with correct order to an array.
$categories = array();
while ($row = mysql_fetch_array($query)) {
    $categories[$row['cat']][] = $row['link'];
}

// To see how we stored the links in the array uncomment the below line
// var_dump($categories);

// To print out the data:
foreach ($categories as $category => $links) {
    echo "<strong>".$category."</strong><br />\n";

    // implode is a built-in function that makes a string from an array.
    // You can put something between the array elements with the first parameter.
    // If you want to make some changes or print the links, use a foreach loop.
    echo implode("<br />\n", $links)."<br /><br />\n";
}
?>

这应该写出你想要的链接。

答案 4 :(得分:1)

ORDER BY categories.order ASC, links.order ASC

答案 5 :(得分:1)

select cat, link
from categories, links
where link.cat-id = categories.id
order by cat asc, link asc;

答案 6 :(得分:1)

根据您的查询,如果我们需要考虑优化,我们会考虑一些案例

案例1: 正如你所提到的,你将有60个(链接)* 5(类别),这些从mysql方面本身很容易处理。我们可以很好地使用我们的SQL技术并从中获得优势。

总是你可以混合使用php处理+ SQL。 PHP的处理速度比mysql快。 sO,GRAB IT。

您的查询也可以单独通过SQl解决,并且可以简单地使用paolo提到的查询。

案例2: 存在一个或两个表参与表具有太多记录的情况。当它们之间存在连接时,会产生大量的组合,即连接大小 例如:链接(100000)*类别(10)= 1百万 在这些情况下,你可以尝试避免加入。

您可以利用索引。 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关的行。

有像扁平文件这样的技术,比如像MongoDB这样的无架构数据库,它们不使用连接的概念,但如果你计划在一个巨大的网站上运行它(很大,意味着你需要很多服务器来托管它)

MySQl可以很好地扩展,当你在huuuuuuuge环境中时,你必须考虑一些事情。

在这里,我已经在不使用连接和任何相关查询的情况下解决了您的查询。我刚刚获取结果,只使用了更快的数组映射技术。

 $query = mysql_query("SELECT * FROM category order by `order` asc");
 while($row = mysql_fetch_assoc($query) ) {
     $categories[$row['id']]['cat']  = $row['cat'];
     $categories[$row['id']]['order'] = $row['order'];

 } 

 $query = mysql_query("SELECT * FROM links ORDER BY `order` ASC ");
 $count =0; 
 while($row = mysql_fetch_assoc($query) ) {
     $links[$row['cat-id']][$count]['link']  = $row['link'];
     $links[$row['cat-id']][$count]['order']  = $row['order'];
     $links[$row['cat-id']][$count]['cat-id']  = $row['cat-id'];
     $count++; 
 } 

foreach ($categories as $id=$value) {
     foreach ($links[$id] as $link_info) {

         if ($last_cat != $link_info['cat-id'])
             print '<h3' . $categories[$link_info['cat-id']]['cat'] . '</h3';

         print $link_info['link'] . '<br';
         $last_cat = $link_info['cat-id'];
     } }

答案 7 :(得分:0)

很多人都说:

SELECT c.cat,c.order as catorder,c.id,l.* FROM categories as c 
INNER JOIN links as l ON (c.id = l.id-cat )
ORDER BY c.order, l.order 

所以你有这样的结果:

cat     | catorder | id  |  link   | order | cat-id
--------|----------|-----|---------|-------|-------
Health  |  1       | 3   |  link7  |  1    |  3
Hi-Tech |  2       | 15  |  link5  |  2    |  15
Hi-Tech |  2       | 15  |  link4  |  6    |  15
Hi-Tech |  2       | 15  |  link2  |  8    |  15
News    |  3       | 23  |  link1  |  2    |  23
News    |  3       | 23  |  link6  |  4    |  23
Biz     |  5       | 8   |  link8  |  1    |  8
Biz     |  5       | 8   |  link3  |  1    |  8  

所以..你需要做一个“切割控制”

$max = sizeof($arrayOfResults)
$i = 0;
while ($i < $max) {
    $current = $arrayOfResults[$i]["id"];
    print_r($arrayOfResults[$current]["cat"]);
    while ($i < $max && $arrayOfResults[$i]["id"] == $current) {
        print_r($arrayOfResults[$current]["link"]);
        $i++;
    }
}

如果您复制并粘贴此代码,您将获得用于搜索的输出。

如果你需要解释,请问我。

答案 8 :(得分:-1)

代码可能是这样的。

<?php
$result_catg = mysql_query("select * from categories order by order asc");
?>
<ul>
<?php
while($row_catg = mysql_fetch_array($result_catg))
{
$catg_id = $row_catg['id'];
$result_link = mysql_query("select * from links where cat_id = '$catg_id' order by order asc");
while($row_link = mysql_fetch_array($result_link))
{
?>
<li class="down"><?php echo $row_link['link']; ?></li>
<?php
}
}
?>
</ul>

只需在css属性中使用“float:none” li down

希望这会有所帮助。

答案 9 :(得分:-1)

这将为您提供所需的结果。

$ds = mysql_query("select cat, id from categories order by  'order' asc");
while($rs = mysql_fetch_row($ds))
{
    echo"<b>".$rs[0]."<b><br/>";
    $dsLinks = mysql_query("select link from links where cat_id = '".$rs[1]."' order by 'order' asc");
    while($rsLink = mysql_fetch_row($ds))
    {
        echo"<b>".$rsLink [0]."<b><br/>";
    }
    echo"<br/>";
}