簡體   English   中英

MySQL從不同的表中選擇名稱

[英]Mysql Select by name from different table

我在MySQL內有以下2個表:

表格設定

|id |name|clientid|
------------------
| 1 | a  | 33    |
------------------
| 2 | b  | 34    |
------------------

表客戶端

|id  |clientname |
------------------
| 33 | c         |
------------------
| 34 | a         |
-----------------

我在嘗試進行搜索查詢的地方,它將始終從第一個表返回ID。

到目前為止查詢:

$this->conn->prepare("SELECT Settings.id as value, 
                             Settings.name as label 
                      FROM Settings
                      LEFT JOIN client ON Settings.clientid = client.id
                      WHERE Settings.name LIKE :keyword 
                            OR Settings.id LIKE :keywordid 
                            OR client.clientname LIKE :keywordclient 
                      LIMIT 10");

$stmt->bindValue(':keyword', "%{$this->keyword}%", PDO::PARAM_STR); 
$stmt->bindValue(':keywordid', "%{$this->keyword}%", PDO::PARAM_STR);   
$stmt->bindValue(':keywordclient', "%{$this->keyword}%", PDO::PARAM_STR);   

因此,基本的想法是以下內容:如果搜索字母a,則搜索將在“設置”中進行搜索,以查看keywrod是否為LIKE ID或名稱,或者必須在客戶端表中進行搜索並查看其是否類似於“客戶端名稱”。 結果始終必須是“設置”表中的“ Id”,而不是其他兩個頁面中的名稱或客戶端名稱作為標簽,具體取決於結果。

在這種情況下,結果必須是兩個

value: 1 label: a
value: 2  /*from Settings table*/ label: a  /*from the client table*/

任何幫助將是感激解決這種情況。

通過ORDER BY Settings.idORDER BY value添加ORDER BY value (忘了哪一個笑)

SELECT Settings.id as value,
        Settings.name as label 
    FROM Settings
        LEFT JOIN client ON Settings.clientid = client.id
    WHERE Settings.name LIKE :keyword 
        OR Settings.id LIKE :keywordid 
        OR client.clientname LIKE :keywordclient 
    ORDER BY Settings.id
    LIMIT 10

一種方法是通過將問題分為兩個SELECT查詢來利用UNION 第一個查詢只能在“設置”表中搜索; 而第二個只在Client表中執行相同的操作。 這種方法的另一個優勢是將效率較低的LEFT JOIN轉換為INNER JOIN

SQL查詢將是:

(SELECT id   AS value,
        name AS label
 FROM   settings
 WHERE  name LIKE :keyword
         OR id LIKE :keyword
 LIMIT  10)
UNION
(SELECT s.id   AS value,
        c.name AS label
 FROM   settings AS s
        JOIN client AS c
          ON c.id = s.clientid
 WHERE  c.clientname LIKE :keyword
 LIMIT  10)
ORDER  BY value
LIMIT
10 

注意:由於只需要10行,因此我在兩個SELECT查詢中都設置了LIMIT 10 ,以優化稍后選擇的要合並的數據。

暫無
暫無

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

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