【问题标题】:PHP MySQL Getting Data Out of Multiple TablesPHP MySQL 从多个表中获取数据
【发布时间】:2009-06-02 13:01:50
【问题描述】:

我昨天问了一个类似的问题,可能措辞不好,无论哪种方式我都不明白,这是我真正需要破解的问题:)我以前从未做过,对很多人来说非常有用我的项目。

这是一个目录网站。我有三个表:entrylocationentry-locationsentry 包含有关建筑物的信息,例如名称、地址、图像等。location 只是每个建筑物可能的位置的列表。位置表与此示例几乎无关,它只包含有关我可以在网站其他区域显示的位置的信息。

entry-locations 是将条目链接到位置的表。它只有两个字段,entry-idlocation...如果您想知道为什么我需要一个单独的表格,因为同一建筑物 可能 有多个位置(不要问)。

基本上,我需要做的是显示来自它自己页面的每个位置的列表。例如,我需要列出法国的所有建筑物,因此查询需要通过 entry-locations 表返回位置为“France”的每条记录,然后需要从中提取所有数据entry-id 对应的 entry 表返回。

我确信有一种方法可以通过一个查询来做到这一点,如果我可以向我展示如何在这么多项目中复制它,那将是非常棒的。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    这个怎么样?

    -- // Selects all the columns from both entry-locations and entry
    SELECT * 
    FROM entry-locations
    JOIN entry e ON e.id = el.entry-id
    WHERE el.location = 'France';
    
    -- // To just get the entry data for matching records: (Remove DISTINCT if you
    -- // don't mind, or want, each entry with multiple locations in the result set
    -- // multiple times)
    SELECT DISTINCT e.* 
    FROM entry-locations el
    JOIN entry e ON e.id = el.entry-id
    WHERE el.location = 'France'
    

    编辑:好的,所以我尝试删除位置表,而是使用 entry-location.location 作为位置的名称。这是否正确?

    【讨论】:

    • 就像我说的位置表完全无关,它根本不需要在查询中。我只需要(用文字):“从位置='France'的入口位置中选择*”,但随后我需要从结果记录中获取入口ID并显示每个入口表中的数据......
    • 当您想根据位置名称限制结果时,怎么能说它无关紧要?
    • 不,您会从您加入的所有表中获取聚合数据,即。所有列。如果您只想要条目表中的数据,请参阅我上面的编辑
    • 假设只有两个表,“entry-locations”和“entry”。 'entry-locations' 包含entry-id 和location,entry-id 对应entry 表中的一个ID,location 只是一个词。你现在明白了吗?
    • 我不确定.. 但我试了一下。如果这不正确,您能否为每个涉及的表提供 SHOW CREATE TABLE ?
    【解决方案2】:

    假设你有这些数据:

    参赛作品

    |id|name|
    | 1|Foo |
    | 2|Bar |
    

    入口位置

    |entry-id|location|
    |1       |France  |
    |2       |Greece  |
    |2       |France  |
    

    这就是我从您的描述中理解表格的方式。更常见的方法是拥有

    Entry(id,name)
    Location(id,name)
    Entry_Location(entry_id, location_id)
    

    我认为这也是其他帖子中一些混乱的根源。

    现在,让 MySql 从 id 匹配的两个表中获取数据。

    SELECT entry.* 
    FROM `entry`, `entry-location` as el
    WHERE entry.id = el.`entry-id`
    AND el.location = 'France';
    

    MySql 现在将您的数据视为一张表,如下所示:

    |entry.id|entry.name|el.location|
    |       1|       Foo|     France|
    |       1|       Foo|     Greece|
    |       2|       Bar|     France|
    

    并从该表中选择el.location = 'France' 所在的条目,并返回指定的字段。

    此查询从entry 表中提取与您设置的要求相匹配的所有字段。 首先,它使 MySql 将两个表视为一个表,SELECT-ing 来自它们。

    看看MySql的SELECT reference

    【讨论】:

      【解决方案3】:

      select * from entry where id in (select entry-id from entry-locations)

      【讨论】:

      • 您能提供替代方案吗?
      【解决方案4】:

      如果我明白了你的想法,你需要: select e.* frmm entry join entry-locations as as l ON l.entry-id=e.id WHERE l.location='France'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        • 1970-01-01
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多