【发布时间】:2014-11-03 08:46:57
【问题描述】:
让我先介绍一下我要实施的最终解决方案。
我想显示特定类别中的类别以及任何三个或三个以下的子类别。
表格:listing_info
listing_id(PK) | Market | Project_Name
1 | A | A.a
2 | A | A.b
3 | A | A.c
4 | A | A.d
5 | A | A.e
6 | A | A.f
7 | B | B.a
8 | B | B.b
9 | B | B.c
10 | B | B.d
11 | C | C.a
12 | C | C.b
13 | D | D.a
14 | D | D.b
15 | D | D.c
16 | D | D.d
17 | D | D.e
18 | E | E.a
19 | F | F.a
这里 Market 是类别,Project_Name 是子类别。
我使用了两种方法,需要知道选择哪一种以及为什么?此外,我正在寻找任何更好的解决方案或可以对现有解决方案进行的任何优化
方法一:
使用简单查询并进一步调用 db 获取子类别。 这可以通过使用ajax分页或onload分页来优化
我们可以将LIMIT 和OFFSET 与每个加载事件设置为某个数字x 的倍数。
$data = sql::read("SELECT Market FROM listing_info GROUP BY Market LIMIT ? OFFSET ?");
<?php foreach($data as $d)
{ ?>
<div class="Market">
<h2> <?php echo $d->Market ?> </h2>
<?php
$subcat = sql::read("SELECT Project_Name FROM listing_info WHERE Market =".$d->Market."LIMIT 3");
foreach($subcat as $sc) ?>
<h3 class="Project_Name"> <?php echo $sc->Project_Name ?> <h3>
<?php } ?>
</div>
<?php } ?>
方法二:
我们可以一次调用所有值,包括每个类别中的任意三个或少于三个子类别。
<?php
$data=sql::read("SELECT t1.Market, t1.Project_Name
, COUNT(t2.listing_Id) AS cnt
FROM listing_info AS t1
LEFT JOIN listing_info AS t2
ON (t1.Project_Name, t1.listing_Id) <= (t2.Project_Name, t2.listing_Id)
AND t1.Market = t2.Market
GROUP BY t1.listing_Id
HAVING cnt <= 3
ORDER BY t1.Market, cnt
");
$mydata = objectToArray($data); // Converting object array to associative array
//And then finding the count of each category
$counted = array_count_values(array_map(function($value){return $value['Market'];}, $mydata));
//var_dump($counted)
/* array
'A' => int 3
'B' => int 3
'C' => int 2
'D' => int 3
'E' => int 1
'F' => int 1
*/
$index = 0;
foreach($counted as $k=>$v)
{
?>
<div class="Market">
<h2> <?php echo $k ?> </h2>
<?php for($m=0; $m < $v; $m++)
{ ?>
<h3> <?php echo $mydata[$index]["Project_Name"]; ?> <h3>
<?php $index++; } ?>
<div>
<?php } ?>
第一种方法提供了 ajax 的好处,但关注的是多个 sql 调用,第二种方法提供了更少的 sql 调用的好处,但我无法使用 ajax 完成它。
任何帮助优化代码或任何其他更好的解决方案将不胜感激
提前致谢
【问题讨论】:
-
查询的选择不应该影响您是否可以使用 AJAX。 AJAX 与 SQL 无关。
-
@meagar 但是分页确实可以减少页面渲染的不必要负载.. 那么哪个仍然是更好的方法?
-
你为什么不同时实现?
-
@KeVin 第二个查询替代我正在寻找它是否可以与 LIMIT 一起使用
-
如果我们在第二种方法中实现 ajax .. 我们可以在每个后续加载事件中将 db 调用从 13 减少到 1。
标签: php mysql ajax optimization pagination