Reputation: 35
Table 1 | ID | Post_Name | Post_Status | Parent_ID | Post_Content | Post_Type | +----+------------+-------------+-----------+--------------+-----------+ | 1 | John Sample| publish | 0 | Content Text | person | | 2 | | inherit | 1 | image1.jpg | attachment| | 3 | | inherit | 1 | image2.jpg | attachment| | 4 | | inherit | 1 | image3.jpg | attachment| | 5 | Mark Sample| publish | 0 | Mark Text | person | | 6 | | inherit | 5 | image1.jpg | attachment| | 7 | | inherit | 5 | image2.jpg | attachment| | 8 | | inherit | 5 | image3.jpg | attachment| Table 2 | meta_id | post_id | meta_key | meta_value | +---------+----------+----------------+-----------------------+ | 1 | 1 | Address | Sample Street,Country | | 2 | 1 | Phone | 10000000000000 | | 3 | 1 | Sex | Male | | 4 | 1 | Primary pic | 2 | | 5 | 2 | Thumbnail | John_thumbnail.jpg | | 6 | 2 | meta_data | data_data_data | | 7 | 5 | Address | Mark Street,Country | | 8 | 5 | Phone | 20000000000000 | | 9 | 5 | Sex | Male | | 10 | 5 | Primary pic | 6 | | 11 | 6 | Thumbnail | Mark_thumbnail.jpg | | 12 | 6 | meta_data | data_data_data |
I would like to display like this
Name: John Sample
Comment: Content Text
Address: Sample Street, Florida
Phone: 10101010101010
Sex: Male
Thumbnail: John_thumbail.jpg
Photo: images1.jpg, images2.jpg, images3.jpg
Name: Mark Sample
Comment: Mark Text
Address: Mark Street, Florida
Phone: 20101010101010
Sex: Male
Thumbnail: Mark_thumbail.jpg
Photo: images1.jpg, images2.jpg, images3.jpg
Upvotes: 2
Views: 170
Reputation: 79979
Try this:
SELECT
t.Post_Name AS Name,
MAX(CASE WHEN t2.meta_key = 'Address' THEN t2.meta_value END) AS 'Address',
MAX(CASE WHEN t2.meta_key = 'Phone' THEN t2.meta_value END) AS 'Phone',
MAX(CASE WHEN t2.meta_key = 'Sex' THEN t2.meta_value END) AS 'Sex',
GROUP_CONCAT(DISTINCT p.Post_Content SEPARATOR ',') AS Photo
FROM Table1 p
INNER JOIN table1 t ON p.parent_ID = t.ID
INNER JOIN Table2 t2 ON t.Id = t2.post_id
GROUP BY p.Post_Name;
This will give you:
| NAME | ADDRESS | PHONE | SEX | PHOTO |
--------------------------------------------------------------------------------------------------
| John Sample | Sample Street,Country | 10000000000000 | Male | image3.jpg,image2.jpg,image1.jpg |
Then using PHP, you can display them the way you want.
If you want to display the value of user comment
as comment, you can do this:
SELECT
t.Post_Name AS Name,
MAX(CASE WHEN t2.meta_key = 'Address' THEN t2.meta_value END) AS 'Address',
MAX(CASE WHEN t2.meta_key = 'Phone' THEN t2.meta_value END) AS 'Phone',
MAX(CASE WHEN t2.meta_key = 'Sex' THEN t2.meta_value END) AS 'Sex',
GROUP_CONCAT(DISTINCT p.Post_Content SEPARATOR ',') AS Photo,
GROUP_CONCAT(DISTINCT t.post_Content) comment
FROM Table1 p
INNER JOIN table1 t ON p.parent_ID = t.ID
INNER JOIN Table2 t2 ON t.Id = t2.post_id
GROUP BY p.Post_Name;
Based on the updated sample data:
SELECT
p.Post_Name AS Name,
MAX(CASE WHEN t.meta_key = 'Address' THEN t.meta_value END) AS 'Address',
MAX(CASE WHEN t.meta_key = 'Phone' THEN t.meta_value END) AS 'Phone',
MAX(CASE WHEN t.meta_key = 'Sex' THEN t.meta_value END) AS 'Sex',
GROUP_CONCAT(DISTINCT c.Post_Content SEPARATOR ',') AS Photo,
GROUP_CONCAT(DISTINCT p.post_Content) comment
FROM
(
SELECT *
FROM Table1
WHERE parent_id = 0
) AS p
INNER JOIN table1 AS c ON p.ID = c.parent_ID
INNER JOIN table2 AS t ON t.post_id = p.id
GROUP BY p.post_Name;
This will give you:
| NAME | ADDRESS | PHONE | SEX | PHOTO | COMMENT |
-----------------------------------------------------------------------------------------------------------------
| John Sample | Sample Street,Country | 10000000000000 | Male | image2.jpg,image1.jpg,image3.jpg | Content Text |
| Mark Sample | Mark Street,Country | 20000000000000 | Male | image3.jpg,image1.jpg,image2.jpg | Mark Text |
For the updated data, try this:
SELECT
t1.*,
t2.meta_value AS 'Thumbnail'
FROM
(
SELECT
p.Post_Name AS Name,
MAX(CASE WHEN t.meta_key = 'Address' THEN t.meta_value END) AS 'Address',
MAX(CASE WHEN t.meta_key = 'Phone' THEN t.meta_value END) AS 'Phone',
MAX(CASE WHEN t.meta_key = 'Sex' THEN t.meta_value END) AS 'Sex',
MAX(CASE WHEN t.meta_key = 'Primary pic' THEN t.meta_value END) AS 'Primary_pic',
GROUP_CONCAT(DISTINCT c.Post_Content SEPARATOR ',') AS Photo,
GROUP_CONCAT(DISTINCT p.post_Content) comment
FROM
(
SELECT *
FROM Table1
WHERE parent_id = 0
) AS p
INNER JOIN table1 AS c ON p.ID = c.parent_ID
INNER JOIN table2 AS t ON t.post_id = p.id
GROUP BY p.post_Name
) AS t1
INNER JOIN table2 t2 ON t1.Primary_pic = t2.post_id
AND t2.meta_key = 'Thumbnail';
This will give you:
| NAME | ADDRESS | PHONE | SEX | PRIMARY_PIC | PHOTO | COMMENT | THUMBNAIL |
----------------------------------------------------------------------------------------------------------------------------------------------------
| John Sample | Sample Street,Country | 10000000000000 | Male | 2 | image3.jpg,image1.jpg,image2.jpg | Content Text | John_thumbnail.jpg |
| Mark Sample | Mark Street,Country | 20000000000000 | Male | 6 | image1.jpg,image2.jpg,image3.jpg | Mark Text | Mark_thumbnail.jpg |
For this new meta_data
column you will need one more join to the second table as we did for the primary pic
like this:
SELECT
t1.Name,
t1.Address,
t1.Phone,
t1.Sex,
t1.Photo,
t1.Comment,
t2.meta_value AS 'Thumbnail',
t3.meta_value AS 'meta_data'
FROM
(
SELECT
p.Post_Name AS Name,
MAX(CASE WHEN t.meta_key = 'Address' THEN t.meta_value END) AS 'Address',
MAX(CASE WHEN t.meta_key = 'Phone' THEN t.meta_value END) AS 'Phone',
MAX(CASE WHEN t.meta_key = 'Sex' THEN t.meta_value END) AS 'Sex',
MAX(CASE WHEN t.meta_key = 'Primary pic' THEN t.meta_value END) AS 'Primary_pic',
GROUP_CONCAT(DISTINCT c.Post_Content SEPARATOR ',') AS Photo,
GROUP_CONCAT(DISTINCT p.post_Content) comment
FROM
(
SELECT *
FROM Table1
WHERE parent_id = 0
) AS p
INNER JOIN table1 AS c ON p.ID = c.parent_ID
INNER JOIN table2 AS t ON t.post_id = p.id
GROUP BY p.post_Name
) AS t1
INNER JOIN table2 t2 ON t1.Primary_pic = t2.post_id
AND t2.meta_key = 'Thumbnail'
INNER JOIN table2 t3 ON t1.Primary_pic = t3.post_id
AND t3.meta_key = 'meta_data';
This will give you:
| NAME | ADDRESS | PHONE | SEX | PHOTO | COMMENT | THUMBNAIL | META_DATA |
-------------------------------------------------------------------------------------------------------------------------------------------------------
| John Sample | Sample Street,Country | 10000000000000 | Male | image1.jpg,image2.jpg,image3.jpg | Content Text | John_thumbnail.jpg | data_data_data |
| Mark Sample | Mark Street,Country | 20000000000000 | Male | image2.jpg,image3.jpg,image1.jpg | Mark Text | Mark_thumbnail.jpg | data_data_data |
Upvotes: 3
Reputation: 2415
Try the below code
SELECT Table1.ID,
Table1.POST_NAME,
Table1.Post_Status,
Table1.Parent_ID,
Table1.Post_Content,
Table1.Post_Type,
Table2.meta_id,
Table2post_id,
Table2meta_key,
Table2.meta_value
FROM TABLE2,TABLE1
WHERE TABLE1.id= TABLE2.post_id
Upvotes: 1
Reputation: 1157
I would look into JOINS in SQL so something like this:
SELECT post.post_name,
phone.meta_value
FROM table_1 AS post
LEFT JOIN table_2 AS phone
ON post.id = phone.id
AND phone.meta_key = "phone"
edit as needed.
Upvotes: 0