检查是否存在多对多关系

时间:2016-03-23 22:16:45

标签: php mysql database wordpress many-to-many

我已经阅读了Stackoverflow上的几十个问题,并使用了Google的最佳能力,但我无法弄清楚如何做到这一点:

我有这两个表:

  1. 网站(包括字段site_id和site_name)
  2. 国家/地区(包括字段country_id和country_name)
  3. 这些表通过此表在彼此之间存在多对多关系:

    j_sites_countries (包括字段accepted_country_id,site_FK和country_FK)

    目标是检查网站是否接受来自某个国家/地区的客户,并仅显示接受该国家/地区客户的网站。因此,例如,仅显示接受来自美国客户的网站。

    检查网站与国家/地区之间的关系是否存在所需的代码行是什么?我绝对迷失在这里,并希望得到任何帮助。

    我认为它是这样的,但我不知道如何实际建立表之间的连接,以便我可以显示country_id匹配site_id的网站:

    <plugin>
      <artifactId>maven-shade-plugin</artifactId>
      <version>2.4.3</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <artifactSet>
              <includes>
                <include>groupId:artifactId</include>
                <include>groupId2:artifactId2</include>
              </includes>
            </artifactSet>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

1 个答案:

答案 0 :(得分:1)

这是 JOIN 的工作。让我们来看看它:

我要假设,除非我被告知,在联接表中,country_FK表示某个网站 accepted_country_id是网站服务的国家/地区。

编辑经过反思,并根据上述评论,我认为如果country_FK是网站所服务的国家,该网站更合乎逻辑 location 是表sites中的一列。我假设accepted_country_id是一个合成密钥列,可以安全地忽略,直到它被删除为止,我相应地修改了我的例子。

首先,为了完整起见,我们会使用简单的过滤 SELECT 查找服务于一个国家/地区的网站。

SELECT site_FK, country_FK
  FROM j_sites_countries
  WHERE country_FK = 'CA';

(您当然会在数据库中使用任何形式的国家/地区ID。)

接下来,我们将编写 JOIN 查询,以查找这些网站所服务的国家/地区的名称。 (由于选择的唯一的国家是加拿大,这个例子是意义大于实际更能说明问题,但它会派上用场,在后面的例子)。这里的表的别名只是为了降低打字,但后来他们会派上用场。

SELECT j.site_FK, c.country_name
  FROM countries c
  JOIN j_sites_countries j
    ON c.country_id = j.country_FK
  WHERE j.country_FK = 'CA';

现在我们做同样的事情来获取网站名称:

SELECT s.site_name, c.country_name
  FROM countries c
  JOIN j_sites_countries j
    ON c.country_id = j.country_FK
  JOIN sites s
    ON j.site_FK = s.site_id
  WHERE j.country_FK = 'CA';

最后,只是为了它,我将加入所服务的国家的名称并做一点格式化。 (这是表别名变得必要的地方,因为我们正在加入countries 两次,并且MySQL需要能够分开引用。)为了促进这一点,我假设表{{ 1}}包含一个列sites,它是网站的位置。

country

要扩展示例,要按国家/地区提供的网站类型进行过滤,请使用复合 SELECT s.site_name AS "Site", c2.country_name AS "In", c1.country_name AS "Serves" FROM countries c1 JOIN j_sites_countries j ON c1.country_id = j.country_FK JOIN sites s ON j.site_FK = s.site_id JOIN countries c2 ON s.country = c2.country_id WHERE j.country_FK = 'CA'; 子句:

WHERE

我希望不仅可以回答你的问题,还可以帮助你回答下一个问题。