显示多连接查询的结果

时间:2011-10-25 01:45:47

标签: php mysql sql

我有一个SQL查询,显示检索到2行,但是当我回显字段name时,没有检索到任何内容。谁知道我做错了什么?

$sql = 'SELECT *
FROM tag_map
LEFT JOIN tags2 ON tags2.tag_id = tag_map.tag_id
LEFT JOIN video ON video.vid_id = tag_map.vid_id
WHERE tag_map.vid_id=?';
$stmt_tags = $conn->prepare($sql);
$result=$stmt_tags->execute(array($vid_id));
echo $tag_count=$stmt_tags->rowCount(); //shows 2
$tags = array();
while ($row = $stmt_tags->fetch(PDO::FETCH_ASSOC)) {
    echo $row['name'];
}

编辑:Var_dump使用建议的查询

SELECT tag_map.*, tags2.name AS tag_name
FROM tag_map
LEFT JOIN tags2 ON tags2.tag_id = tag_map.tag_id
LEFT JOIN video ON video.vid_id = tag_map.vid_id
WHERE tag_map.vid_id=?


array(4) { ["id"]=> string(4) "1234" ["vid_id"]=> string(32) "8364a8e463052e215a5dc174c92a2f18" ["tag_id"]=> string(32) "4c71a73d001dd9c09c7d9d95907bf1fe" ["tag_name"]=> NULL } array(4) { ["id"]=> string(3) "123" ["vid_id"]=> string(32) "8364a8e463052e215a5dc174c92a2f18" ["tag_id"]=> string(32) "57bb5dd83dc84e7115387886e328b04b" ["tag_name"]=> NULL }

3 个答案:

答案 0 :(得分:2)

更明确地了解SELECT列表中的列和表:

$sql = "SELECT tag_map.*, tags2.*, video.* 
FROM tag_map
LEFT JOIN tags2 ON tags2.tag_id = tag_map.tag_id
LEFT JOIN video ON video.vid_id = tag_map.vid_id
WHERE tag_map.vid_id=?";

如果您不需要所有表中的所有列,请删除不需要的表。更好的方法是明确命名所需的列,如:

SELECT 
  tag_map.name,
  tag_map.id,
  ...
  ...
  video.length
FROM ...etc...

答案 1 :(得分:2)

您确定有一个名为name的列吗?数组键区分大小写,因此如果它是Name,则需要它。

另外,请尝试var_dump($row)查看所有内容。

答案 2 :(得分:2)

您应该在SELECT子句中具体,特别是在加入其他表时。

例如

SELECT tag_map.vid_id, tag_map.name, tags2.name AS tag_name

请注意我是如何使用tags2.name的别名来避免列名与tag_map.name冲突。

我只是在这里猜测,但我会说你的一张左边连接的表中有一个name列,它覆盖了tag_map.name

更新

根据额外的信息,我不得不说这完全是由于你的左连接。 tags2.name显示为NULL的记录根本没有tag_map中有关vid_id的相关字段。

如果您只想显示tag_maptags2之间存在关联的记录,请使用INNER JOIN

在这里演示 - http://sqlize.com/UL1M80DT0c