【问题标题】:JOIN returns only a single resultJOIN 只返回一个结果
【发布时间】:2013-08-23 13:00:11
【问题描述】:

我必须查询给定的表。我无法更改表结构。基本上是这样的:

user
-- ---------- ----
id address_id name

address
-- ---
id zip

language
-- ----
id lang

其中 语言 条目的id 与用户的 id 相同。它的主键基于id 和lang。 用户上的address_id可以是null。

现在我想通过一个查询来获取所有内容。我试过了:

SELECT
    p.name,
    l.lang,
    a.zip

FROM user p

JOIN language l ON p.id = l.id

LEFT JOIN address a ON p.address_id = a.id

WHERE p.id = :id

LIMIT 1

这实际上有效,除了一件事:它只返回连接到用户的第一种语言。如何检索所有语言?

编辑

我正在使用 PHP PDO 检索结果:

$value = $stmt->fetch(PDO::FETCH_ASSOC);

会不会有错误?

【问题讨论】:

  • 删除LIMIT 1?
  • 不应该是p而不是e吗?
  • 我已经试过了。不幸的是,这不会改变结果集。
  • @ExplosionPills 正确。修正了这个问题,我从一个更大的查询中减少了这个问题。
  • 那么,在语言表中是否有多个记录与特定的id?

标签: php mysql pdo


【解决方案1】:

看到您的查询后,我意识到您需要了解查询中的LIMIT 子句。

阅读tutorial of LIMIT。

您在查询中使用LIMIT 1,这就是它只检索一行的原因。 删除该限制子句以从查询中获取完整数据。

已编辑:

或者代替您的查询尝试以下查询:

SELECT
    p.name,
    l.lang,
    a.zip
FROM user p, language l, address a
WHERE p.id = l.id AND p.address_id = a.id AND p.id = :id

【讨论】:

  • 根据 OP,哪个给出了相同的结果?
  • 非常感谢您的帮助。当我得到那 15 个代表时,我也会回来投票。
  • 终于拿到rep了。 ;)
【解决方案2】:

fetch() 只会获取一行。在这样的循环中使用它:

while ($row = $stmt->fetch(PDO::FETCH_ASSOC))

或fetchAll() 行一次。

正如在 cmets 和 Broken Heart ღ 的回答中已经讨论过的,您还应该删除 LIMIT 1 声明。

【讨论】:

  • 非常感谢您的帮助。当我得到那 15 个代表时,我会回来投票。
  • 终于拿到rep了。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 2014-04-17
  • 2016-05-23
  • 2017-01-03
  • 1970-01-01
相关资源
最近更新 更多