簡體   English   中英

查詢以選擇和替換2個不同表中的記錄

[英]Query to select and alternate records from 2 different tables

我正在嘗試在PHP CodeIgniter中的重復查找器應用程序中優化一些查詢。 為了保持MVC模式並避免直接在視圖或控制器中進行DB調用,我正在尋找一個查詢,該查詢將替換來自2個不同表的結果:

duplicate_leads

╔════╦══════════════╦═══════════╦════════════════════╦═══════════╗
║ id ║ original_id  ║    name   ║       email        ║   phone   ║
╠════╬══════════════╬═══════════╬════════════════════╬═══════════╣
║  1 ║      345     ║   Stack   ║ stack@overflow.com ║ 0000-0000 ║
║  2 ║      495     ║ Exchange  ║ stack@exchange.com ║ 0000-0000 ║
╚════╩══════════════╩═══════════╩════════════════════╩═══════════╝

leads

╔═════╦═══════════╦════════════════════╦═══════════╗
║ id  ║    name   ║       email        ║   phone   ║
╠═════╬═══════════╬════════════════════╬═══════════╣
║ 345 ║   Stack   ║ stack@overflow.com ║ 0000-0000 ║
║ 495 ║ Exchange  ║ stack@exchange.com ║ 0000-0000 ║
╚═════╩═══════════╩════════════════════╩═══════════╝

duplicate_leads.original_id是涉及領先優勢擴大到原來的鉛的價值leads.id

嘗試#1

SELECT
    a.id,
    a.name,
    a.email,
    a.phone
FROM
    leads a
        JOIN duplicate_leads b
            ON a.id = b.original_id

產生:

╔═════╦═══════════╦════════════════════╦═══════════╗
║ id  ║    name   ║       email        ║   phone   ║
╠═════╬═══════════╬════════════════════╬═══════════╣
║ 345 ║   Stack   ║ stack@overflow.com ║ 0000-0000 ║
║ 495 ║ Exchange  ║ stack@exchange.com ║ 0000-0000 ║
║ ... ║    ...    ║         ...        ║    ...    ║
╚═════╩═══════════╩════════════════════╩═══════════╝

似乎正在從兩個表之一中檢索記錄。 我沒有SQL的高級經驗,所以我不知道在這種特殊情況下如何正確使用聯接或聯合,因為我認為無論哪種方式,查詢將返回的結果都是這種結果的串聯:

╔═════╦═══════════╦════════════════════╦═══════════╗
║ id  ║    name   ║       email        ║   phone   ║
╠═════╬═══════════╬════════════════════╬═══════════╣
║ 345 ║   Stack   ║ stack@overflow.com ║ 0000-0000 ║
║ 495 ║ Exchange  ║ stack@exchange.com ║ 0000-0000 ║
║     ║   Stack   ║ stack@overflow.com ║ 0000-0000 ║
║     ║ Exchange  ║ stack@exchange.com ║ 0000-0000 ║
╚═════╩═══════════╩════════════════════╩═══════════╝

我實際上期望的是:首先顯示的行(因為它們可能是多個)應該是leads表中的記錄。 這些記錄應與duplicate_leads引線的original_id ID匹配,該記錄應在匹配記錄的下一行,如下所示:

╔═════╦═══════════╦════════════════════╦═══════════╗
║ id  ║    name   ║       email        ║   phone   ║
╠═════╬═══════════╬════════════════════╬═══════════╣
║ 345 ║   Stack   ║ stack@overflow.com ║ 0000-0000 ║ from leads
║     ║   Stack   ║ stack@overflow.com ║ 0000-0000 ║ from duplicate_leads
║ 495 ║ Exchange  ║ stack@exchange.com ║ 0000-0000 ║ from leads
║     ║ Exchange  ║ stack@exchange.com ║ 0000-0000 ║ from duplicate_leads
║ ... ║    ...    ║         ...        ║    ...    ║
╚═════╩═══════════╩════════════════════╩═══════════╝

多個匹配示例:

╔═════╦═══════════╦════════════════════╦═══════════╗
║ id  ║    name   ║       email        ║   phone   ║
╠═════╬═══════════╬════════════════════╬═══════════╣
║ 345 ║   Stack   ║ stack@overflow.com ║ 0000-0000 ║ from leads
║ 677 ║   Stack   ║ stack@overflow.com ║ 0000-0000 ║ from leads
║     ║   Stack   ║ stack@overflow.com ║ 0000-0000 ║ from duplicate_leads
║ 495 ║ Exchange  ║ stack@exchange.com ║ 0000-0000 ║ from leads
║     ║ Exchange  ║ stack@exchange.com ║ 0000-0000 ║ from duplicate_leads
║ ... ║    ...    ║         ...        ║    ...    ║
╚═════╩═══════════╩════════════════════╩═══════════╝

我怎樣才能達到那個結果?

更新資料

SQL小提琴: http ://sqlfiddle.com/#!9 / 6d87a9 / 1

我相信你想寫這個:

SELECT
a.id,
a.name
a.email
FROM leads a
UNION ALL
SELECT
a.id,
a.name
a.email
FROM leads a
INNER JOIN duplicate_leads b
ON a.id = b.original_id
ORDER BY a.id

第一個查詢(在合並之前)將為您的潛在客戶表中的每條記錄提供一行

第二個查詢將為您的重復表中的每個潛在顧客提供一行(假設它在潛在顧客表中有匹配項-如果所有設置都正確,則應該匹配),但會在潛在顧客中顯示記錄信息找到匹配項的表。

然后,ORDER BY可以幫助您可視化此結果,以便根據原始潛在客戶ID對所有行進行分組

要記住的重要一點是,連接兩個表會創建一個表,其中包含兩個表中的所有列(然后您可以使用SELECT修剪顯示的列)。 使用標准聯接,將保留原始表中的所有字段,並且如果在第二個表中找到匹配項,這些字段也將被填充。 否則,它們將為null。

這就是為什么您的原始查詢只給您每個線索一行的原因。 如果選擇*,您將更好地了解幕后情況

像這樣:

SELECT id, name, email, phone
FROM (
    SELECT l.id, l.name, l.email, l.phone, dl.original_id
    FROM leads AS l
    JOIN duplicate_leads AS dl
        ON dl.original_id = l.id
    UNION ALL
    SELECT NULL AS id, dl.name, dl.email, dl.phone, dl.original_id
    FROM leads AS l
    JOIN duplicate_leads AS dl
        ON dl.original_id = l.id
) AS leads_combined
ORDER BY original_id ASC, id > 0 DESC, id ASC;

應該更接近您的要求。 我已經將先前的查詢與Daniel Long的答案中的JOIN合並,以僅查找具有重復項的線索,並在結果中重復項之前對線索進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM