Mysql根据一个表中的ID从2个表中选择数据

时间:2018-01-12 05:36:02

标签: php mysql sql

我有2张桌子。我需要根据另一个表中的ID从一个表中选择数据。

表格是:

first_table

user_id
4      
5      
6      

second_table

post_id|meta_key  |meta_value   |
1      |email     |test@test.com|
1      |first_name|test         |
1      |last_name |hey          |
2      |email     |test@test.com|
2      |first_name|test         |
2      |last_name |hey          |
3      |email     |test@test.com|
3      |first_name|test         |
3      |last_name |hey          |
4      |email     |4th@test.com |
4      |first_name|4th fname    |
4      |last_name |4th          |
5      |email     |test@test.com|
5      |first_name|test         |
5      |last_name |hey          |
6      |email     |test@test.com|
6      |first_name|test         |
6      |last_name |hey          |

我需要数据:

post_id|first_name|last_name|email
4      |4th fname |4th      |4th@test.com

同样我将获得post_id 5,6的这些数据。该ID将来自first_table user_id列。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

答案 2 :(得分: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);
    }

答案 3 :(得分: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子句 user_id = 4

答案 4 :(得分:0)

您正在显示的演示表是一种存储数据的错误方法。存储数据的正确方法是将用户详细信息存储在用户表中,并分别在post表中发布详细信息。然后添加用户表的主键作为post表的外键。 然后,您可以执行查询以获得上述结果。