我正在使用以下'php'和'MySQL'代码列出我数据库中的最新主题,并列出每个标题下面的相关标题......
// First Query
$query= mysql_query("SELECT * FROM my_table ORDER BY id DESC limit 0,20");
$result = mysql_query($query)
while($row = mysql_fetch_array($result)){
echo "Main Topic: ".$row['title'];
$main_title = $row['title'];
echo "Related to this Topic:";
// Second Query
$related_query= mysql_query("
SELECT * MATCH (title)
AGAINST('$main_title'IN NATURAL LANGUAGE MODE)AS
score FROM my_table MATCH(title) AGAINST('$main_title'IN NATURAL LANGUAGE MODE)
HAVING score > 10 ORDER BY score DESC
");
$related_result = mysql_query($related_query)
while($related_row = mysql_fetch_array($related_result)){
echo "<br>". $related_row['title'];
}
}
这很好用。但问题是它在循环中使用MySQL查询。 (第二个查询运行20次)我读过它不是一个好的编程实践,因为它大量使用服务器资源。
那么,有没有办法在一个查询或两个查询中执行此操作而无需在循环中运行查询?
谢谢
答案 0 :(得分:0)
首先,停止使用mysql_*()
功能。它们已被弃用多年。
其次,一旦开始使用像PDO这样合理的数据库接口甚至只是mysqli,您就可以进行准备好的查询。可以在循环外部准备查询,这将节省资源并减少所花费的时间。
第三,这可能是通过一个查询来完成的,但需要发布DB结构才能确定。
编辑:这是一些未经测试的PDO代码:<?php
try {
$db = new PDO("mysql:host=localhost;dbname=my_database", "user", "pass");
} catch(PDOException $e) {
echo $e->getMessage();
exit;
}
$result = $db->query("SELECT * FROM my_table ORDER BY id DESC LIMIT 20");
$result->setFetchMode(PDO::FETCH_ASSOC);
$stmt = $db->prepare("SELECT * MATCH (title) AGAINST (? IN NATURAL LANGUAGE MODE) AS score FROM my_table MATCH (title) AGAINST (? IN NATURAL LANGUAGE MODE) HAVING score > 10 ORDER BY score DESC");
while ($row = $result->fetch()) {
echo "Main Topic: $row[title]";
$params = array($row["title"], $row["title"]);
$result2 = $stmt->execute($params);
$result2->setFetchMode(PDO::FETCH_ASSOC);
while ($row2 = $result2->fetch()) {
echo "<br>$row2[title]";
}
}