【问题标题】:Join 2 mysql queries, where the second query depends on the output of the first加入 2 个 mysql 查询,其中第二个查询取决于第一个查询的输出
【发布时间】:2012-04-19 23:23:32
【问题描述】:

我使用我的第一个查询来获取用户的 ID 和名称,如下所示:

select id,name from temp_card where sex='$sex' and city='$city' order by name ASC

然后我有第二个查询,它使用第一个查询的结果,并从另一个表中获取更多数据:

select images from temp_card_images where temp_card_id=". $row['id'] ." order by id ASC limit 1

如何组合这两个查询,以便在单个 while 循环中打印出 3 个字段(id、name 和 images)?

谢谢!

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您需要执行 JOIN 查询

    select tc.id, tc.name, tci.images from temp_card tc
    left join temp_card_images  tci
    on tc.id = tci.temp_card_id
    where tc.sex='$sex' and tc.city='$city' order by tc.name ASC
    

    【讨论】:

    • 如果两个表都有一个名为 id 的列。我们如何指定使用哪个?
    • 使用表名和列名如temp_card.id
    • 我收到此错误:注意:在您的 SQL 查询脚本中发现了一个错误:“字段列表中的列 'id' 不明确”。它指向我的数据库类文件。它指向的行是: trigger_error('Uncovered an error in your SQL query script: "' . $this->error() . '"');
    • 在这里使用 INNER JOIN 肯定更好吗?如果 tci.temp_card_id 中不存在 tc.id 怎么办?
    • liquorcivar,我也使用了您的查询,但遇到了同样的错误。我不确定问题出在哪里。
    【解决方案2】:

    您需要了解 JOIN。可以这样实现

    SELECT tc.id,tc.name,tci.images
    FROM temp_card tc
        INNER JOIN temp_card_images tci ON tc.id=tci.temp_card_id
    WHERE sex='$sex' 
      AND city='$city' 
    GROUP BY tc.id
    ORDER BY name ASC
    

    【讨论】:

    • 如果我只想从 temp_card_image 表中选择一行怎么办?对于 temp_card 表中的每个结果,只有一个图像?
    • @salmanhijazi 如果您只想要一张图片,请添加限制。我还在 SELECT 子句中添加了表别名,这应该可以解决该错误。如果您想要 temp_card_images id,那么您只需将 tc.id 更改为 tci.id。
    • 当我添加限制一时,它只返回一个结果。我希望它为每个 temp_card 行返回 1 个图像。该查询在没有限制的情况下工作得很好,但在这种情况下,它会返回每个 temp_card 行的所有图像。
    • @salmanhijazi 好的,我不太明白。你的意思是你想要每个 tc.id 的第一个条目(按名称 ASC 排序)?
    • 假设 temp_card 表中有 10 行满足我的性别和城市条件。对于每一行,temp_card_images 表中有 10 行。我希望查询返回 temp_card 表中的所有 10 行,但 temp_card_images 表中的每行仅返回 1 行。这有意义吗?
    【解决方案3】:

    虽然不相关,但我强烈建议您考虑使用PDO 作为您的数据库访问层。它适用于大多数数据库类型,如 MySQL、SQLite 等。它有助于防止 SQL 注入到您的数据库中。

    编辑

    删除了答案,因为给定的连接是更好的答案。

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 2022-10-04
      • 2022-11-30
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多