【问题标题】:Help with grasping (INNER?) JOIN帮助抓(INNER?)JOIN
【发布时间】:2010-03-23 23:07:28
【问题描述】:

我在构建查询时遇到问题。我可以在 3 个不同的查询中做我想做的事。

SELECT id FROM table1 WHERE url LIKE '%/$downloadfile'
put that in $url_id
SELECT item_id FROM table2 WHERE rel_id = '$url_id'"
put that in $item_id
SELECT rel_id FROM table2 WHERE rel_id = '$item_id' AND field_id = '42'"
put that in $user_id

但是通过阅读有关联接和内部联接的示例,我认为有一种更优雅的方式。我无法全神贯注地编写一个更好的查询(但希望)我可以描述它应该如何进行:

表1 字段:id、url

表2 字段 item_id、rel_id、field_id

我知道 table1.url (LIKE '%/$filename') 的最后一部分,我选择了 table1.id。 table1.id 等于 table2.rel_id 中的一个条目。所以得到它并选择table2.item_id。 在 table2 中有另一个具有相同 table2.item_id 的条目,它将有一个 table2.field_id = '42' 最后,我需要的值是 table2.rel_id,其中 table2.field_id 为 42。 我将获取该值并将其放入 $user_id

这可以通过使用联接/内联接的一个查询来完成吗?

【问题讨论】:

    标签: php mysql


    【解决方案1】:
    SELECT url, second.rel_id AS user_id
    FROM table1
    INNER JOIN table2 AS first
      ON table1.id=first.rel_id
    INNER JOIN table2 AS second
      ON first.item_id=second.rel_id
    WHERE second.field_id='42'
      AND table1.url LIKE '%/:downloadfile'
    

    【讨论】:

    • 是的,它有效!在第二个内部连接中进行一个小的更改,请参阅我的答案。我什至得到同一张表的双重实例:P
    【解决方案2】:

    当然,应该是这样的:

    SELECT t2_second.rel_id
    FROM table1 t1
    INNER JOIN table2 t2_first ON t1.id = t2_first.rel_id
    INNER JOIN table2 t2_second ON t2_second.rel_id = t1_first.item_it
    WHERE 
       t1.url = '%/:filename' AND
       t2_second.field_id = 42
    

    您甚至可以输入一个 distinct 以便每个 t2_second.rel_id 只返回一次:

    SELECT DISTINCT [...]
    

    但是,如果 t2_second.field_id = 42 将查询限制为每个 t2_second.rel_id 仅返回一行,您可能不需要这个

    【讨论】:

      【解决方案3】:

      这个对我有用的查询,对伊格纳西奥的回答做了一个小改动:

      SELECT url, second.rel_id AS user_id
      FROM table1
      INNER JOIN table2 AS first
        ON table1.id=first.rel_id
      INNER JOIN table2 AS second
        ON first.item_id=second.item_id
      WHERE second.field_id='42'
        AND table1.url LIKE '%/:downloadfile'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-09
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        相关资源
        最近更新 更多