Запрос sql требует ввода из другой таблицы

97
5

У меня есть база данных, где я хочу данные из двух таблиц, они выглядят примерно так:

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;

Где $cat_id - выход из первой записи. Но я хочу объединить их в один оператор, и я не нашел здесь полезную ссылку? Поэтому мой вопрос в основном состоит в том, как я могу объединить их в один запрос?

спросил(а) 2021-01-28T01:44:09+03:00 3 месяца, 1 неделя назад
1
Решение
88

Вы можете присоединиться к двум таблицам вместе и фильтровать по мере необходимости.

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.

ответил(а) 2021-01-28T01:44:09+03:00 3 месяца, 1 неделя назад
44

Возможно, единственный способ - использовать подзапрос. хотя я не способ, это хороший путь.

    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;

ответил(а) 2021-01-28T01:44:09+03:00 3 месяца, 1 неделя назад
44

вы можете использовать концепцию объединения, как я предлагаю

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

ответил(а) 2021-01-28T01:44:09+03:00 3 месяца, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема