我刚刚开始学习如何正确地进行INNER JOINS,我想不出最好/最简单的方法。
我正在构建一个url shortener,我正在尝试构建一个查询,它将使所有long_url.destination匹配一个slug“test”。一个slug可能指向多个long_url.destination(URL改组,GEO匹配等......)。所以我需要slug来使用相同的short_url.slug来获取所有long_url.destination。
在我运行另一个查询以从slug获取short_id之前,然后运行另一个查询以选择long_url中具有匹配short_id的所有行。
我认为如果我使用内连接可能会更快,但我不确定如何正确设置它。
我想获取表long_url中的所有目标列,只有short_url中的slug数据,而不必运行单独的查询来从slug中获取short_id。
Table: short_url
Columns: short_id | slug | enabled | timestamp
example: 1 test 1 1323343922
Table: long_url
Columns: long_id | short_id | destination | geo | enabled | timestamp
example: 1 1 http://www.test.com US 1 132334922
example: 2 1 http://www.test.co.uk UK 1 132334922
到目前为止我得到了这个:
SELECT destination, geo FROM long_url INNER JOIN short_url
ON long_url.short_id = short_url.short_id WHERE enabled = 1;
function get_long_urls($slug) {
$query = "SELECT....";
$stmt = $db->prepare($query);
$stmt->execute(array(':slug' => $slug));
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
return (array) $results:
}
example $results = array(
'http://www.test.com' => 'US',
'http://www.test.co.uk' => 'UK',
);
感谢您的帮助。
答案 0 :(得分:2)
select long_url.destination
, long_url.geo
from long_url
inner
join short_url
on long_url.short_id = short_url.short_id
where short_url.slug = :slug
and long_url.enabled = 1
您不需要像我一样限定所有列名,因为在此特定查询中没有任何歧义。我真正做的就是添加一个绑定参数占位符。
答案 1 :(得分:0)
SELECT destination, geo FROM long_url LEFT JOIN short_url ON (long_url.short_id = short_url.short_id) WHERE enabled = 1