4

以下脚本最初旨在随机选择一行,它可以做得很好,但是,我无法弄清楚如何修改它以使用名为“nid”的列 ID 从第二个表中选择数据,这是相同的在两个表中:

    $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 字段位于两个不同的表中;最终,我想为随机选择的节点回显一个匹配的标题和 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"];

 }

效果很好。

4

3 回答 3

1

供将来参考,因为您已经解决了问题,您需要在开始新连接之前关闭以前的连接,或者释放结果

$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上的连接,这将导致您稍后再次遇到同样的问题。

于 2013-05-27T07:10:24.703 回答
1

如果这只是要选择一条记录,则不必定义 LIMIT,而是可以使用随机生成的值在 WHERE 中使用它来选择行!

于 2013-05-28T06:55:39.637 回答
0

你可以加入这两个表。除此之外,您的代码存在潜在问题。它依赖于至少 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()更加随机。如果你愿意,你可以省略它。

于 2013-05-28T10:55:59.847 回答