![](/img/trans.png)
[英]Join two table and count, avoid zero if record is not available in second table
[英]Join two table and reads two record from second table
我想加入兩個表,從第一個表中讀取一個記錄,從第二個表中讀取兩個記錄。 第一個表有一些我想全選的字段。 第二個表已通過外鍵連接到第一個表。
第一表:
+----+-------------+
| id | some_fields |
+----+-------------+
| 23 | S.T |
+----+-------------+
| 24 | S.T |
+----+-------------+
| 25 | S.T |
+----+-------------+
第二張桌子
+----+----------+------------+
| fid| meta_key | meta_value |
+----+----------+------------+
| 24 | meta_1 | m_1 |
+----+----------+------------+
| 24 | meta_2 | m_2 |
+----+----------+------------+
| 25 | meta_2 | m_3 |
+----+----------+------------+
我想要的倉庫:
+----+-------------+--------+-------+
| id | some_fields | meta_1 | meta_2|
+----+-------------+--------+-------+
| 24 | S.T | m_1 | m_2 |
+----+-------------+--------+-------+
| 25 | S.T | null | m_3 |
+----+-------------+--------+-------+
我知道此查詢是錯誤的:
SELECT *
FROM posts
INNER JOIN postmeta ON ( posts.id = postmeta.fid )
WHERE 1 =1
AND (
postmeta.meta_key = 'meta_1'
OR postmeta.meta_key = 'meta_2'
)
AND posts.post_type = 'ignition_product'
AND (
posts.post_status = 'publish'
OR posts.post_status = 'private'
)
GROUP BY posts.ID
ORDER BY postmeta.meta_value +0 DESC
LIMIT 0 , 7
使用多個聯接到postmeta
表:
SELECT posts.id, posts.some_fields, meta1.meta_value as meta_1, meta2.meta_value as meta_2
FROM posts
LEFT JOIN postmeta meta1 ON posts.id = meta1.fid AND meta_key = 'meta1'
LEFT JOIN postmeta meta2 ON posts.id = meta2.fid AND meta_key = 'meta2'
WHERE meta1.fid IS NOT NULL OR meta2.fid IS NOT NULL
第一個JOIN
將用於填充列meta_1
的數據,第二個meta_2
填充列meta_2
。
如果您只有兩種類型的元,則上面的查詢有效。 如果您有更多或數量是動態的,則需要使用其他方法。
使用數據透視查詢:
SELECT t1.id,
t1.some_fields,
t2.meta_1,
t2.meta_2
FROM posts t1
LEFT JOIN
(
SELECT fid,
MAX(CASE WHEN meta_key = 'meta_1' THEN meta_value END) AS meta_1,
MAX(CASE WHEN meta_key = 'meta_2' THEN meta_value END) AS meta_2
FROM postmeta
GROUP BY fid
) t2
ON t1.id = t2.fid
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.