我在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*/
解决这种情况将对您有所帮助。
答案 0 :(得分:0)
通过ORDER BY Settings.id
或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
答案 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
,以优化稍后选择的要合并的数据。