Mysql выбрать данные из 2 таблиц на основе идентификатора из одной таблицы

0

У меня 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.

  • 0
    Попробуйте мой ответ, надеюсь, это поможет
Теги:

5 ответов

1
Лучший ответ

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
  • 0
    Благодарю. Это сработало. :)
  • 0
    Добро пожаловать...
0

Демонстрационные таблицы, которые вы показываете, являются неправильным способом хранения данных. Правильный способ хранения данных - это данные пользователя магазина в таблице пользователя и данные для отправки в таблице сообщений отдельно. Затем добавьте первичный ключ таблицы пользователя в качестве внешнего ключа таблицы сообщений. Затем вы можете выполнять запросы для получения результатов, как указано выше.

0
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

0

Вы можете сделать внутреннее соединение обеих таблиц, и поскольку вы хотите видеть вывод на уровне 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;
0

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

   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);
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню