我有一个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 }
答案 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_map
和tags2
之间存在关联的记录,请使用INNER JOIN
在这里演示 - http://sqlize.com/UL1M80DT0c