У меня 2 таблицы. Мне нужно выбрать данные из одной таблицы на основе идентификатора из другой таблицы.
Таблицы:
first_table
user_id
4
5
6
second_table
post_id|meta_key |meta_value |
1 |email |[email protected]|
1 |first_name|test |
1 |last_name |hey |
2 |email |[email protected]|
2 |first_name|test |
2 |last_name |hey |
3 |email |[email protected]|
3 |first_name|test |
3 |last_name |hey |
4 |email |[email protected] |
4 |first_name|4th fname |
4 |last_name |4th |
5 |email |[email protected]|
5 |first_name|test |
5 |last_name |hey |
6 |email |[email protected]|
6 |first_name|test |
6 |last_name |hey |
Мне нужны данные:
post_id|first_name|last_name|email
4 |4th fname |4th |[email protected]
То же самое я получу эти данные для post_id 5,6. Идентификатор будет first_table
user_id
столбца first_table
user_id
.
MAX()
и CASE
помогают вам получить результат.
Попробуй это:
select post_id
,max(case when meta_key='first_name' then meta_value end)first_name
,max(case when meta_key='last_name ' then meta_value end)last_name
,max(case when meta_key='email' then meta_value end)email
from second_table
where post_id in(select user_id from first_table)
group by post_id
Демонстрационные таблицы, которые вы показываете, являются неправильным способом хранения данных. Правильный способ хранения данных - это данные пользователя магазина в таблице пользователя и данные для отправки в таблице сообщений отдельно. Затем добавьте первичный ключ таблицы пользователя в качестве внешнего ключа таблицы сообщений. Затем вы можете выполнять запросы для получения результатов, как указано выше.
SELECT first_table.user_id,second_table.post_id,second_table.meta_key ,second_table.meta_value first_table LEFT JOIN second_table ON first_table.user_id=second_table.post_id;
если вам нужно условие разумно использовать where where в последнем запросе, где user_id = 4
Вы можете сделать внутреннее соединение обеих таблиц, и поскольку вы хотите видеть вывод на уровне user_id
, вы можете агрегировать другие поля с MAX (или даже с другой функцией, поскольку все это текстовые значения) на основе meta_key
который идет для преобразования в столбец.
SELECT A.USER_ID,
MAX(CASE WHEN B.META_KEY = 'FIRST_NAME' THEN B.META_VALUE END) AS FIRST_NAME,
MAX(CASE WHEN B.META_KEY = 'LAST_NAME' THEN B.META_VALUE END) AS LAST_NAME,
MAX(CASE WHEN B.META_KEY = 'EMAIL' THEN B.META_VALUE END) AS EMAIL
FROM
FIRST_TABLE A
INNER JOIN
SECOND_TABLE B
ON A.USER_ID = B.POST_ID
GROUP BY A.USER_ID;
вы можете попробовать его, не используя внутреннее соединение
function userdata($id){
$SQL = "SELECT user_id FROM first_table where user_id= :id;
$q = $this->DBcon->prepare($SQL);
$q->execute(array(':id' => $id));
$data = $q->fetch(PDO::FETCH_ASSOC);
$postid = $data[post_id]
$sql2 = "SELECT post_id, first_name, last_name, email FROM second_table Where post_id = $postid";
$q = $this->DBcon->prepare($SQL2);
$q->execute();
$data = $q->fetch(PDO::FETCH_ASSOC);
}