【问题标题】:mysql join 2 table resultsmysql join 2表结果
【发布时间】:2011-07-08 16:35:55
【问题描述】:

我有 3 张桌子:

网站:ID、名称
关联:site_id, assoc_type, assoc_id
选项:ID、姓名

我想一次性完成以下查询

SELECT * FROM sites
    FOREACH site SELECT * FROM assoc WHERE assoc_type='option' AND site_id = site.ID
    FOREACH assoc SELECT name FROM options WHERE ID = assoc.ID

FOREACH SITE
    echo name, array(option 1, option2, option3);

这可能吗?

我正在尝试缩短的代码

      $getsites = mysql_query("SELECT * FROM sites")or die(mysql_error());
      while($row = mysql_fetch_array($getsites)){
        echo $row['name'];
        $getassoc = mysql_query("SELECT * FROM assoc WHERE type='options' AND site_id = '$row[ID]'")or die(mysql_error());
        echo'<ul>';
        while($subrow = mysql_fetch_array($getassoc)){
          $getoption = mysql_query("SELECT * FROM options WHERE ID = '$subrow[assoc_id]'")or die(mysql_error());
          $option = mysql_fetch_assoc($getoption);
          echo '<li>'.$option['name'].'</li>';
       }
       echo'</ul><br/>';

       }

【问题讨论】:

  • 每个站点都与最多 3 个选项相关?

标签: mysql sql join


【解决方案1】:
SELECT s.name
     , ( SELECT o.name
         FROM Options AS o
           JOIN Assoc AS a
             ON a.assoc_id = o.ID
         WHERE a.site_id = s.id
           AND a.assoc_type='option'
         ORDER BY o.id
         LIMIT 1 OFFSET 0
       ) AS option1
     , ( SELECT o.name
         FROM Options AS o
           JOIN Assoc AS a
             ON a.assoc_id = o.ID
         WHERE a.site_id = s.id
           AND a.assoc_type='option'
         ORDER BY o.id
         LIMIT 1 OFFSET 1
       ) AS option2
     , ( SELECT o.name
         FROM Options AS o
           JOIN Assoc AS a
             ON a.assoc_id = o.ID
         WHERE a.site_id = s.id
           AND a.assoc_type='option'
         ORDER BY o.id
         LIMIT 1 OFFSET 2
       ) AS option3
FROM Sites AS s

如果您想执行 3 个表的常规连接,以查找所有站点和相关选项,您可以使用:

SELECT s.name AS site
     , o.name AS option
FROM Sites AS s
    JOIN Assoc AS a
        ON a.site_id = s.id
    JOIN Options AS o
        ON o.ID = a.assoc_id
WHERE a.assoc_type = 'option'
ORDER BY s.name
       , o.name

【讨论】:

猜你喜欢
  • 2019-04-09
  • 2014-11-04
  • 2016-10-07
  • 2015-08-15
  • 2013-10-07
  • 2014-11-09
  • 1970-01-01
  • 2017-09-27
  • 2015-09-03
相关资源
最近更新 更多