Использование PHP + MySQL Left Join для объединения результатов из 2 запросов

Вот где я застреваю. У меня есть две таблицы, из которых я пытаюсь получить информацию. Одна таблица содержит данные, представляющие интерес под idа также post_title столбцы, другой содержит данные под post_id, meta_key, а также meta_value колонны.

У меня есть массив чисел, хранящихся в $in, с помощью которого я могу отфильтровать данные из обеих таблиц.

Чтобы вернуть id а также post_title Из первой таблицы просто:

$query = "SELECT id, post_title FROM wplz_posts WHERE id IN ($in)";

Это, конечно, возвращает имя и уникальный идентификатор для этого имени, например:

[id] => 8
[post_title] => Rustic Wooden Chair

Однако я также хочу получить цену, связанную с id возвратился выше, и единственный запрос, который сделает это, будет выглядеть примерно так:

$query = "SELECT meta_value
FROM wplz_postmeta
WHERE post_id IN ($in) AND meta_key = '_price'";

Моя проблема в том, что я хотел бы иметь возможность возвращать все эти данные в один массив с одним запросом вместо двух, таким образом, оба post_title и meta_value будет соответствовать каждому отдельному числу в $in (скажем, 8), который затем позволит мне вернуть запрос в массив, а затем перебрать этот массив по мере необходимости. Честно говоря, я потратил немало времени на это, и я думаю, что для того, чтобы попытаться сделать, требуется «СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ», но после нескольких видео и уроков я так и не смог понять, как заставить работать эту неуловимую технику. Спасибо за помощь. 🙂

1

Решение

Вы хотели бы сделать INNER JOIN это выглядит так:

$query = "SELECT p.id, p.post_title, pm.meta_value
FROM wplz_posts p
INNER JOIN wplz_postmeta pm ON pm.post_id=p.id
WHERE p.id IN ($in)
AND pm.meta_key = '_price'";

Вам нужно присоединиться к id а также post_id ключи, но также фильтруют объединение на основе значения meta_key, которое является _price

1

Другие решения

Если на каждой стороне объединения есть ровно по 1 строке, вы ищете INNER JOINне LEFT JOIN,

SELECT id, post_title,meta_value FROM wplz_posts
INNER JOIN wplz_postmeta
ON wplz_postmeta.post_id=wplz_posts.id
WHERE wplz_posts.id IN ($in)
AND meta_key = '_price'

Но вы можете настроить характер JOIN, если могут быть случаи, когда только 1 таблица имеет совпадающие записи

2

Вы правы, что вы можете использовать оставил присоединиться. Этот запрос вернет объединенные таблицы. Если в мета-таблице нет строк, соответствующих записи, $array['meta_value] будет null, Если совпадают несколько строк, id а также post_title будут продублированы

Если вы заранее знаете, что в каждом сообщении есть хотя бы одно мета-значение, вы можете использовать внутреннее соединение вместо.

SELECT t1.id, t1.post_title, t2.meta_value
FROM wplz_posts AS t1
LEFT JOIN wplz_postmeta AS t2 ON t1.id = t2.post_id
2
По вопросам рекламы [email protected]