棘手的MySQL JOIN查询

时间:2014-07-15 00:52:28

标签: mysql sql join

我有一个文本输入,在键盘上我想要更新相邻选择字段中的选项。

我的数据库中有这两个表:

型号:

ID  modelName  brandID
1   NA140           3
1   SRL             1
1   SRS             1
1   SRF             1
1   SMS             2
1   SMU             2

品牌:

ID  brandName
1    Samsung
2    Bosch
3    Panasonic

在选择字段中,我想列出品牌表中的所有brandNames,但列出它们与文字输入的相关性。 因此,如果键入“SR”,modelNames的顺序将是SRF,SRL,SRS,SMU,SMS,NA140,然后相应的brandName作为结果被抓取,但仅列出每个品牌一次。

我该如何撰写此查询?

我有这个基本想法,我认为这就是我需要的......

JOIN models & brands ON m.brandID = b.ID

MATCH modelName to string%

SELECT UNIQUE brandName 

7 个答案:

答案 0 :(得分:0)

我能想到的唯一方法是首先选择匹配用户输入的位置,得到那些结果,然后再做它的位置,然后将结果与联合组合,如下所示:

(SELECT `t1`.`modelName`, `t1`.`brandID`,`t2`.`brandName` FROM `Models` as `t1` INNER JOIN `Brands` AS `t2` ON `t1`.`brandID`=`t2`.`ID` WHERE `t1`.`modelName` LIKE 'SR%' ORDER BY `t1`.`modelName`,`t2`.`brandName`)
UNION
(SELECT `t1`.`modelName`, `t1`.`brandID`,`t2`.`brandName` FROM `Models` as `t1` INNER JOIN `Brands` AS `t2` ON `t1`.`brandID`=`t2`.`ID` WHERE `t1`.`modelName` NOT LIKE 'SR%' ORDER BY `t1`.`modelName`,`t2`.`brandName`)

可能有一种更有效的方法可以做到这一点,这是我在去商店之前想到的:)

答案 1 :(得分:0)

你在找这样的东西吗?

SELECT DISTINCT brandname
  FROM models m JOIN brands b
    ON m.brandid = b.id
 ORDER BY modelname LIKE 'S%' DESC,
          modelname LIKE 'SR%' DESC,
          modelname

输出:

| BRANDNAME |
|-----------|
|   Samsung |
|     Bosch |
| Panasonic |

这是 SQLFiddle 演示

更新:对于SMU%输入字符串,查询应该是

SELECT DISTINCT brandname
  FROM models m JOIN brands b
    ON m.brandid = b.id
 ORDER BY modelname LIKE 'S%' DESC,
          modelname LIKE 'SM%' DESC,
          modelname LIKE 'SMU%' DESC,
          modelname

输出:

| BRANDNAME |
|-----------|
|     Bosch |
|   Samsung |
| Panasonic |

这是 SQLFiddle 演示

答案 2 :(得分:0)

我提出了类似的查询(简化):

select brandName from (
select b.brandName as brandName, m.modelName 
from brands b join models m 
on m.brandid = b.id 
where m.modelName like '%sr%'
union
select b.brandName as brandName, m.modelName 
from brands b join models m 
on m.brandid = b.id 
where m.modelName not like '%sr%') as curb
group by brandName

SQLfiddle:http://sqlfiddle.com/#!2/593b36/30

(不完全是品牌和型号的命名)

答案 3 :(得分:0)

select distinct brandName 
from Models m inner join Brands b
on m.brandID = b.ID
where m.modelName like 's%'

<强> Fiddle

答案 4 :(得分:0)

SELECT DISTINCT b.brandName 
FROM brands b 
JOIN models m 
ON m.brandID = b.id 
WHERE m.modelName LIKE '%$variable%' 

UNION 
SELECT b.brandName 
FROM brands b 
JOIN models m 
ON m.brandID = b.id 
WHERE m.modelName NOT LIKE '%$variable%'

答案 5 :(得分:0)

我们需要的是一个函数来计算字段中的值,锚点和表格中的值之间的距离,这个函数可以是锚点HEX和{{1}之间的差值。表值的。

HEX

SQLFiddle Demo

在将值传递给SELECT m.id, modelName, brandName FROM Model m INNER JOIN Brand b ON m.brandID = b.ID ORDER BY ABS(CONV(HEX(RPAD('SR', 5, ' ')), 16, 10) - CONV(HEX(RPAD(modelName, 5, ' ')), 16, 10)) 之前,要获得正确的结果,需要填充字符串以使它们都具有相同的长度,这就是HEX的原因。

要计算差值,将值从base-16转换为base-10,因为距离仅为正RPAD

如果名称长度超过5个字符的模型,ABS的参数需要修改为最长模型的长度。

答案 6 :(得分:0)

我相信解决方案不应该出现在查询部分......至少对于每个输入的字母都是如此。也许你可以对第一个字母进行一次查询,将该字母的数据检索到客户端部分,将名称放在数组中,然后在客户端进行排序。 在服务器端执行此操作显然较慢,但是对每个键入的字母进行查询,考虑到用户键入错误字母的次数,删除(将进行新查询)和再次键入(新查询),这很糟糕表现条款。 将计算放在客户端更好。只有在第一个字母被删除并键入新字母时,您才可以重做查询。 可能你需要一些为什么每次都要进行新的查询,但是......也许是一种不同的方法可以帮助我找到更好的解决方案......