Mysql 从不同的表中按名称选择

Posted

技术标签:

【中文标题】Mysql 从不同的表中按名称选择【英文标题】:Mysql Select by name from different table 【发布时间】:2019-07-13 02:40:02 【问题描述】:

我在 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 还是名称,或者它必须搜索并查看内部客户表,看看它是否像 Clientname。结果总是必须是设置表中的 ID,而不是名称或客户端名称作为其他两个页面的标签,具体取决于结果。

在这种情况下,结果必须是两个

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

任何帮助将不胜感激解决这种情况。

【问题讨论】:

【参考方案1】:

一种方法是利用UNION,将问题分解为两个SELECT 查询。第一个查询只会在设置表中搜索;而第二个只会在 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 查询中,以优化稍后选择用于联合的数据。

【讨论】:

【参考方案2】:

通过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

【讨论】:

以上是关于Mysql 从不同的表中按名称选择的主要内容,如果未能解决你的问题,请参考以下文章

使用Mysql从不同名称的不同表中选择值作为贷方和借方并计算余额

如何从mysql中的表中选择N条记录

从名称具有相同首字母的表中选择

从 MySQL 中的时间戳排序表中按列选择第一个和最后一个匹配项

如何从不同的表中选择数据?

如何从不同的表中以最优化的方式获取国家、州、城市名称