我将此表命名为“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。
答案 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`
为了在页面上显示它,它看起来像这样:
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/>";
}