如何选择前100名(表格)然后限制显示

时间:2018-11-06 12:04:13

标签: php mysql

我的表中有22,000个条目,因此我在显示表时使用了limit,然后用户可以定义要显示的行数:

enter image description here

我的问题是,即使我键入较小的数字(如10),它也只显示10个条目,但每行加载我的整个表行,加载时间将近30秒。

$rpp = 10;
$page = 1;
$temp = ($page-1)*$rpp;
$query = " SELECT * FROM table_me ORDER by date_sourced desc LIMIT $temp, $rpp ";
$page_result = mysqli_query($conn, $query);

我尝试了此操作,并按照说明进行操作,但这无法正常工作,并给我错误:SELECT TOP 300 * FROM table_me LIMIT 0, 25

$query = " SELECT  TOP 300 * FROM table_me ORDER by date_sourced desc LIMIT $temp, $rpp ";

如何仅从表中加载300,但仍然可以访问表中的其余最低值?

然后这是我的代码,用于从表中回显值:

<?php while($row = mysqli_fetch_assoc($page_result)) { $currsamp_id = $row['id'];?>
                                <tr>
                                    <td><input class="ui checkbox" type="checkbox" name="check_box" value="<?php echo $row['id'] ?>"></td>
                                    <td onclick="$('#options_<?php echo $currsamp_id ?>').dropdown('show')" style="overflow: visible !important;"> 
                                        <div class="ui dropdown item" id="options_<?php echo $currsamp_id ?>">
                                            <i class="settings icon"></i><i class="dropdown icon"></i>
                                            <div class="menu">
                                                <?php
                                                    if(isset($_SESSION['username'])) {
                                                        $temp = $row['id'];
                                                        $ds = $row['date_sourced']; $sh = $row['sha1']; $vsdt = $row['vsdt']; $tx = $row['trendx'];  $n = str_replace('\"', '\\\"', $row['notes']);
                                                        echo "<a class='item' style='color: black; width: 100%;' onclick='open_update(\"" . $temp . "\", \"" . $ds . "\", \"" . $sh . "\", \"" . $vsdt . "\",  \"" . $tx . "\",  \"" . $n . "\")'>Update</a>";
                                                    } else {
                                                        echo '<a class="item modal_trigger" style="color: black; width: 100%;" data-target="#modal_login">Update</a>';
                                                    }
                                                ?>
                                                <?php
                                                    if(isset($_SESSION['username'])) {
                                                        $temp = $row['id']; $sha1 = $row['sha1'];
                                                        echo '<a class="item" style="color: black;" onclick="open_delete(\''.$temp.'\', \''.$sha1.'\', \'open\')">Delete</a>';
                                                    } else {
                                                        echo '<a class="item modal_trigger" style="color: black;" data-target="#modal_login">Delete</a>';
                                                    }
                                                ?>
                                            </div>
                                        </div>
                                    </td>
                                    <td nowrap title="Date Sourced"><?php echo $row['date_sourced'] ?></td>
                                    <td nowrap title="SHA-1"><?php echo $row['sha1'] ?></td>
                                    <td nowrap title="VSDT"><?php echo $row['vsdt'] ?></td>
                                    <td nowrap title="TrendX"><?php echo $row['trendx'] ?></td>
                                    <td nowrap title="Notes"><?php echo $row['notes'] ?></td>
                                </tr>
                            <?php } ?>

3 个答案:

答案 0 :(得分:1)

如评论中所述,您正在混合来自两个不同DBMS的语法。

对于 mysql ,请使用LIMIT,而不要使用TOP。另外,LIMIT只有一个参数,没有两个。

这是您更正的查询:

$query = " SELECT * FROM table_me ORDER BY date_sourced DESC LIMIT 100 ";

这将仅返回前100行。

答案 1 :(得分:1)

此外-如果您需要快速找到前十名date_sourced, ,则应在该列上创建索引。

否则,是的,DBMS别无选择,只能扫描整个表,找到最上面的条目,然后再将这些行的第一个 n 提供给您!

在存在索引的情况下,这样的查询实际上是瞬时的。

答案 2 :(得分:0)

我将其作为另一个“答案” ...

使用EXPLAIN动词查看RDBMS如何运行查询,例如,

EXPLAIN SELECT * FROM table_me ORDER BY date_sourced DESC LIMIT 100

这将为您提供所谓的“执行计划”,这实际上是驱动查询引擎的原因。 (RBMS“编译” SQL,考虑各种统计信息,并提出一个计划。它针对每个查询执行此操作。)

EXPLAIN使RDBMS将计划退还给您,而不是随后执行该计划。这可以准确地告诉您RDBMS 如何来获取想要的答案。

如果查询运行“异常缓慢”,这是找出原因的好方法。 (计划数据的格式从一个RDBMS到另一个RDBMS差别很大。)