mysql - 在子查询中获取多行

时间:2015-09-26 08:51:18

标签: php mysql

我需要从另一个表中获取带有帖子图像的多个帖子,每个帖子都有不同的图像。像post1有10张图片,post2有5张图片

我的两个表格是imagepost

post结构

|title |desc |date |postid|...
|title1|desc1|date1| 1    |...
|title2|desc2|date2| 2    |
.
.
.

image结构

|hash  |hits |timestamp |userid |postid|...
|hash1 |hits1|timestamp1|userid1| 1    |...
|hash2 |hits2|timestamp2|userid1| 3    |...
|hash3 |hits3|timestamp3|userid1| 2    |...
|hash4 |hits4|timestamp4|userid1| 1    |...
.
.
.

我需要使用图片获取帖子,postid是获取帖子图片的关键。

我这样做,但它没有给我正确的结果。

SELECT `title`,`desc`,`date` FROM `img`.`post` AS a
INNER JOIN 
(SELECT `hash`,`hits`,`timestamp`,`userid`,`postid` FROM `img`.`image` WHERE `postid` IS NOT NULL) 
AS b
WHERE a.`postid` IS NOT NULL

我的结果是

mysqli_stmt_bind_result($prepare, $title,$desc,$date); 

不适用于

mysqli_stmt_bind_result($prepare, $title,$desc,$date,$hash,$hits,$timestamp,$userid,$postid); 

这会产生错误,因为没有绑定变量不匹配。

我需要获取

的帖子图像数组
$hash,$hits,$timestamp,$userid,$postid

请参阅并建议一种方法。

2 个答案:

答案 0 :(得分:1)

您需要在主查询的SELECT子句中包含子查询中的所有列,因为它定义了主查询返回的内容。此外,不需要子查询,您只需执行普通的JOIN并将WHERE放在主查询中。

您还缺少指定加入两个表的条​​件的ON子句。

SELECT a.title, a.desc, a.date, b.hash, b.hits, b.timestamp, b.userid, b.postid
FROM post AS a
INNER JOIN image AS b ON a.postID = b.postID

您可以将图像信息放入PHP代码中的数组中:

$post_data = array();
while ($prepare->fetch()) {
    if (!isset($post_data[$postid])) {
        $post_data[$postid] = array('title' => $title, 'desc' => $desc, 'date' => $date, 'images' => array());
    }
    $post_data[$postid]['images'][] = array('hash' => $hash, 'hits' => $hits, 'timestamp' => $timestamp, 'userid' => $userid);
}

您还可以使用GROUP_CONCAT在一行中获取所有图像信息。

SELECT a.title, a.desc, a.date, a.postid,
        GROUP_CONCAT(b.hash ORDER BY b.timestamp) AS hash,
        GROUP_CONCAT(b.hits ORDER BY b.timestamp) AS hits,
        GROUP_CONCAT(b.timestamp ORDER BY b.timestamp) AS timestamp,
        GROUP_CONCAT(b.userid ORDER BY b.timestamp) AS userid
FROM post AS a
INNER JOIN image AS b ON a.postID = b.postID
GROUP BY a.postID

在结果中,$hash$hits$timestamp$userid将是以逗号分隔的列表,您可以在PHP中使用explode()将它们分成数组。

答案 1 :(得分:1)

尝试以下代码,

SELECT a.title, a.desc, a.date, b.hash, b.hits, b.timestamp, b.userid, b.postid
FROM post AS a
INNER JOIN image AS b ON a.postID = b.postID GROUP BY a.postid