帮助抓(INNER?)JOIN

时间:2010-03-23 23:07:29

标签: php mysql

我在构建查询时遇到问题。我可以在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 fields: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

可以使用连接/内连接进行一次查询吗?

3 个答案:

答案 0 :(得分:2)

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'

答案 1 :(得分:0)

当然,应该是这样的:

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

你甚至可以抛出一个不同的,以便每个t2_second.rel_id只返回一次:<​​/ p>

SELECT DISTINCT [...]

但是,如果t2_second.field_id = 42限制查询仅为每个t2_second.rel_id

返回一行,则可能不需要此项

答案 2 :(得分:0)

这个对我有用的查询,对Ignacio的回答做了一个小改动:

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'