我有一个数据库,我想要两个表中的数据,它们看起来像这样:
http://[IPv6]
我想从categories: entries:
+----+------+ +----+-------------+-------+-------------+
| id | name | | ID | category_id | title | description |
+----+------+ +----+-------------+-------+-------------+
| 1 | foo | | 1 | 1 | bar | Loreum ip.. |
+----+------+ +----+-------------+-------+-------------+
获取信息,我的输入只是类别名称和条目标题。如果我使用两个语句,它确实有效。类似的东西:
entries
其中SELECT `id` FROM `categories` WHERE `name` = 'foo' LIMIT 1;
SELECT `ID`, `category_id`, `title`, `description` FROM `entries` WHERE `title` = 'bar' AND `category_id` = $cat_id LIMIT 1;
是第一个条目的输出。但是我想将这些结合成一个声明,我在这里找不到有用的连接?所以我的问题基本上是如何将这些组合成一个查询?
答案 0 :(得分:0)
您可以将两个表连接在一起并根据需要进行过滤。
select e.*
from entries e
join categories c on e.category_id = c.id
where e.title = 'bar'
and c.name = 'foo'
order by ?? -- important when using "limit"
limit 1;
此外,要获得一致的行,您应该在查询中添加一个带有适当列的order by
子句。如果你想要任何一行,那么你可以在没有它的情况下使用它。
要完全按照您的方式进行操作,您可以使用子查询:
select *
from entries
where category_id in (
select id
from categories
where name = 'foo'
limit 1
)
and title = 'bar'
limit 1;
但请记住,如果没有order by
子句,您可能会得到limit
的不一致结果。
答案 1 :(得分:0)
你可以像我建议的那样使用连接概念
SELECT `ID`, `category_id`, `title`, `description` FROM `entries`
inner join `categories` on `entries`.`category_id`=`categories`.`id`
WHERE `categories`.`name` = 'foo' AND `title` = 'bar' LIMIT 1;
看起来你看起来很新,请探索关于sql的概念
答案 2 :(得分:0)
可能是使用子查询的唯一方法。虽然我不认为这是一个好方法。
SELECT `ID`, `category_id`, `title`, `description` FROM `entries` WHERE `title` = 'bar'
AND `category_id` = (SELECT `id` FROM `categories` WHERE `name` = 'foo' LIMIT 1) LIMIT 1;