下面的脚本最初打算随机选择一行,它可以做得很好,但是,我无法弄清楚如何修改它以从使用列ID称为"nid"的第二个表中选择数据,这在两个表中是相同的:
$conn = mysqli_connect($host,$username,$password, $database) or die(mysql_error ());
$total_rows = 5;
$selected_row = mt_rand(0, $total_rows);
$query="SELECT * FROM `node` LIMIT $selected_row, 1;";
$result=$conn->query($query);
while($row = $result->fetch_assoc()) {
$node=$row["nid"];
echo $row["title"];
$query2="SELECT * FROM `field_data_body` LIMIT $node, 1;";
$result2=$conn->query($query2);
while($row = $result->fetch_assoc()) {
echo $row["body_value"];
}
不可否认,上面的例子并不是真的有效,但是我很难找到一个例子来说明我所追求的。
这些表位于Drupal站点的数据库中,因此title字段和body_value字段位于两个不同的表中;最后,我想为一个随机选择的节点返回一个title和body_value匹配集的结果。
说到这个脚本,我想使用nid来查找第二个表的对应行。
这可能吗?
工作位,从单个表中选择我想要的数据,格式如下:
$total_rows = 5;
$selected_row = mt_rand(0, $total_rows);
$query="SELECT * FROM `field_data_body` LIMIT $selected_row, 1;";
$result=$conn->query($query);
while($row = $result->fetch_assoc()) {
echo $row["body_value"];
}
?>
更新:根据一个评论者的建议,我使用了一个连接,最后变成了:
$conn = mysqli_connect($host,$username,$password, $database) or die(mysql_error ());
$total_rows = 5;
$selected_row = mt_rand(0, $total_rows);
//Use the result in your limit.
$query="SELECT a.nid, a.title, b.entity_id, b.body_value
FROM node a, field_data_body b
WHERE a.nid = b.entity_id LIMIT $selected_row, 1;";
$result=$conn->query($query);
while($row = $result->fetch_assoc()) {
echo $row["title"];
echo " | ";
echo $row["body_value"];
}
为将来参考,既然你已经解决了你的问题,你需要在开始一个新的连接之前关闭以前的连接,或者释放结果
$conn = mysqli_connect($host,$username,$password, $database) or die(mysql_error ());
$total_rows = 5;
$selected_row = mt_rand(0, $total_rows);
$query="SELECT * FROM `node` LIMIT $selected_row, 1;";
$result=$conn->query($query);
while($row = $result->fetch_assoc()) {
$node=$row["nid"];
echo $row["title"];
$result->close(); // close $result
$query2="SELECT * FROM `field_data_body` LIMIT $node, 1;";
$result2=$conn->query($query2);
while($row = $result->fetch_assoc()) {
echo $row["body_value"];
}
$result2->close(); // close $result2
我还注意到您没有关闭UPDATE上的连接,这将导致您以后再次遇到同样的问题。
如果这只是要选择一条记录,则不必定义LIMIT,而是可以使用随机生成的值在WHERE中使用它来选择行!
您可以直接连接这两个表。除此之外,您的代码还有一个潜在的问题。它依赖于至少5条记录的存在。您可以通过将随机化放入查询中来避免这种情况。代码将是
$conn = mysqli_connect($host,$username,$password, $database) or die(mysql_error());
$query = "SELECT n.*, b.* FROM `node` AS n LEFT JOIN `field_data_body` AS b ON n.nid=b.nid ORDER BY REVERSE(RAND()) LIMIT 0, 1;";
$result = $conn->query($query);
$row = $result->fetch_assoc();
$result->close();
echo $row["title"];
echo $row["body_value"];
REVERSE()
函数使RAND()
的结果更具随机性。如果你愿意,可以省略它