加入在1个表中具有单个id / row的SQL查询,但链接到另一个表中的多个行(相同的id)?

时间:2014-10-17 19:14:58

标签: php mysql database

首先抱歉长问题。

我的问题/情况是这样的。

1。)我在mysql中有2个表

2。)在第一个表中,每个列表都有一个唯一的ID(每个列表都在一行中)

3。)在第二个表中,它具有链接到列表ID的图像的名称/标签,来自第一个表

4.)每个列表可以有多个图像(第二个表中有多行)。

我要做的是从表1中提取所有列表,然后使用表1中的listing.id从表2中提取链接到listing.id的所有图像行。 我很困惑,因为有多个行具有来自表2的相同listing.id。我尝试查询显示*但它只回显表2中的最后一个图像(行)。

当我加入2个表时似乎没有用。而且我不确定我是否会查询两次然后将阵列推到一起。

感谢您的时间

 $result=mysqli_query($con,"SELECT * FROM Listing JOIN listingpic ON 
    (Listing.id = listingpic.listingid)

 WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+300 DAY GROUP BY Listing.id ORDER BY Listing.id DESC") or die( mysqli_error($con));

while ($row = mysqli_fetch_assoc($result))
        {
  $output[] = $row;
        }
        if (!empty($output)){

        echo json_encode( $output );}
        else{

            echo json_encode( [] );
        }

2 个答案:

答案 0 :(得分:0)

每个ID只能获得一个结果,因为您使用了GROUP BY Listing.id。如果不对它们进行分组,则每个表2行都会得到一个结果行,包括每次列表ID。

如果您希望在一个查询中检索一个查询中的数据,一个ID:多个数据",您可以使用GROUP_CONCAT作为示例,然后explode()检索到的字符串结果

否则从表1中获取所有ID,然后在PHP中迭代它们,并为每个ID执行一次额外查询

答案 1 :(得分:0)

专业提示:请勿使用恶意混乱的MySQL扩展程序GROUP BY。阅读:http://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html

专业提示:请勿使用SELECT *,尤其是在您加入桌子时。而是在结果集中枚举所需的列。

SQL的固有特性是结果集(如表)是矩形的。它们有行和列。每行通常代表一些真实世界项 - 一个“实体” - 每列代表该实体的某些属性。

您描述的结果集本来就会重复第一个表中的信息,以便它可以逐行显示第二个表中的信息。

我想,你想要查询的是这个。

SELECT Listing.id, listing.date, 
       listingpic.id, listingpic.url, listingpic.caption
  FROM Listing
  JOIN listingpic ON  Listing.id = listingpic.listingid
  WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+300 DAY 
  ORDER BY Listing.id DESC, listingpic.id

这将为每个图像提供一行。

如果你的内存不足,那是因为你的结果是庞大的。您可能希望以某种方式限制它,使用第一个和最后一个发布日期:

  WHERE date >= curdate() - INTERVAL DAYOFWEEK(curdate())+300 DAY 
    AND date <  curdate() - INTERVAL DAYOFWEEK(curdate())+293 DAY

或使用LIMIT条款。

  ORDER BY Listing.id DESC, listingpic.id
  LIMIT 100