Mysql从其他表中按名称选择

时间:2019-07-13 02:40:02

标签: php mysql sql pdo

我在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*/

解决这种情况将对您有所帮助。

2 个答案:

答案 0 :(得分:0)

通过ORDER BY Settings.idORDER 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

答案 1 :(得分:0)

一种方法是通过将问题分为两个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行,因此我在两个LIMIT 10查询中都放入了SELECT,以优化稍后选择的要合并的数据。