【问题标题】:MySql get matching names from different tablesMySql 从不同的表中获取匹配的名称
【发布时间】:2015-02-22 10:47:36
【问题描述】:

我有 4 个不同的表,分别命名为

ps_product
ps_product_lang
ps_category_lang
ps_manufacturer

ps_product的表是这样的

id_product  id_manufacture  id_category_default
1           1               5
2           1               7
3           1               9
4           1               10
5           1               11
6           1               11

ps_product_lang 是这样的

id_product   name 
1           Faded Short Sleeve T-shirts
2           Blouse
3           Printed Dress
4           Printed Dress
5           Printed Summer Dress
6           Printed Summer Dress
7           Printed Chiffon Dress

ps_category_lang 是这样的

id_category  name
1            paints
2            Home
3            Women
4            Tops
5            T-shirts
6            Tops
7            Blouses

ps_manufacturer 表是这样的

id_manufacturer  name
1                Fashion Manufacturer

现在我希望当我用like 选择名称时,它会显示这些名称中的数据。就像当我 将搜索'paint%' 之类的东西,然后它应该显示来自产品名称、产品类别和制造商名称的匹配名称 那么有人可以告诉我如何加入这些表来获取值吗?任何帮助和建议都会非常有效。谢谢

【问题讨论】:

  • 我会设置 mysql 全文搜索以获得有效的解决方案。
  • 在您搜索时显示您想要的表格输出,以便清楚您想要什么。

标签: mysql sql select join left-join


【解决方案1】:

在所有四个表上尝试 Inner Join,然后在所有名称字段之间执行“和”,如果您希望字段以在这三个表中的任何一个表中进行绘制,例如:

SELECT *
FROM ps_product pp INNER JOIN ps_product_lang ppl  ON pp.id_product          = ppl.id_product
                   INNER JOIN ps_category_lang pcl ON pp.id_category_default = pcl.id_category
                   INNER JOIN ps_manufacturer pm   ON pp.id_manufacturer     = pm.id_manufacturer
WHERE ppl.name like 'paint%'
AND   pcl.name like 'paint%'
AND   pm.name  like 'paint%'

注意:如果您想搜索出现在这三个表中的任何一个中的油漆,则在条件之间使用“OR”而不是“AND”。

【讨论】:

  • 如何只选择名称。因为我有一个大型数据库,并且 select * 运行缓慢。
【解决方案2】:

试试这个:

SELECT pl.name, cl.name, m.name
FROM ps_product p 
LEFT OUTER JOIN ps_product_lang pl ON p.id_product = pl.id_product AND pl.name LIKE 'paint%'
LEFT OUTER JOIN ps_category_lang cl ON p.id_category_default = cl.id_category AND cl.name LIKE 'paint%'
LEFT OUTER JOIN ps_manufacturer m ON p.id_manufacture = m.id_manufacture AND m.name LIKE 'paint%'
WHERE pl.id_product IS NOT NULL OR 
      cl.id_category IS NOT NULL OR 
      m.id_manufacture IS NOT NULL;

SELECT pl.name, cl.name, m.name 
FROM ps_product p 
INNER JOIN ps_product_lang pl ON p.id_product = pl.id_product 
INNER JOIN ps_category_lang cl ON p.id_category_default = cl.id_category 
INNER JOIN ps_manufacturer m ON p.id_manufacture = m.id_manufacture 
WHERE pl.name LIKE 'paint%' OR 
      cl.name LIKE 'paint%' OR 
      m.name LIKE 'paint%';

【讨论】:

  • 如何只选择名称。因为我有一个大型数据库并且 select * 运行缓慢。
  • @saharsh 如果名称不存在于 ps_product 表中,则不会匹配名称,因此您将无法获得所需的所有数据。
【解决方案3】:
 SELECT x.id,y.name,z.name,a.name 
 FROM ps_product x 
 FULL OUTER JOIN ps_product_lang y 
 ON x.id_product = y.id_product 
 FULL OUTER JOIN ps_category_lang z
 ON x.id_category_default = z.id_category 
 FULL OUTER JOIN ps_manufacturer a 
 ON x.id_manufacture = a.id_manufacture 
 WHERE a.name LIKE 'paint%'
 OR y.name LIKE 'paint%'
 OR z.name LIKE 'paint%'

完全外连接在这里是必需的,因为你想匹配所有的名字,所以它会得到所有的数据并匹配模式'paint%'并显示匹配的行。尝试一次

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多