【问题标题】:Very Difficult SQL query into one (mysql)非常难的SQL查询合二为一(mysql)
【发布时间】:2013-10-12 02:24:06
【问题描述】:

我对这个查询感到厌烦。我需要在不同的表中搜索一个单词 结构。我只有一个搜索框,我正在做这三个查询以在不同的地方查找结果。我怎样才能在一个查询中完成所有这些以过滤所有内容????

1) 在这个查询(来自 PHP)中,我使用表“programas_videos”的内连接在表“视频”、名称和表“程序”的描述中搜索单词“$palabra_buscar”

SELECT * FROM videos 
                 INNER JOIN programas_videos ON videos.id_video = programas_videos.id_video 
                 INNER JOIN programas ON programas_videos.id_prog = programas.id_prog 
                 WHERE programas.nombre_prog LIKE "%'.$palabra_buscar.'%" 
                 OR programas.descrip_larga LIKE "%'.$palabra_buscar.'%" 
                 OR videos.descrip_larga LIKE "%'.$palabra_buscar.'%" 
                 GROUP BY videos.id_video DESC LIMIT 10

2) 我有另一个查询,它正在其他表中搜索单词

SELECT * FROM videos
                   INNER JOIN contenidos1 ON videos.metadata = contenidos1.id_metadata 
                   WHERE contenidos1.Title LIKE "%'.$palabra_buscar.'%"
                   OR contenidos1.Summary_Short LIKE "%'.$palabra_buscar.'%"
                   OR contenidos1.Summary_Long LIKE "%'.$palabra_buscar.'%"
                   OR contenidos1.Genre LIKE "%'.$palabra_buscar.'%" LIMIT 10

3) 和这个查询

SELECT * FROM tableOfContents 
         WHERE tableOfContents .titulo LIKE "%'.$palabra_buscar.'%" 
         OR tableOfContents.descripcion LIKE "%'.$palabra_buscar.'%" 
         OR tableOfContents.categoria LIKE "%'.$palabra_buscar.'%" 
         GROUP BY tableOfContents.titulo  LIMIT 10

【问题讨论】:

  • 你能告诉我的列数吗?这 3 个查询是否返回相同数量的具有相同数据类型的列?
  • 是的,但名称不同,例如在表 1 中,您有 NAME、TITLE 和 IMAGE。在表 2 中 NAME、TITLESSS 和 IMAGESSSS... 相同,只是名称不同。
  • 好的,在这种情况下,我认为您可以使用union,然后在查询中为列赋予相同的名称。我现在会发布一个答案。
  • 谢谢EhsanT,你是老大!!!!

标签: mysql sql database join


【解决方案1】:

好的,

首先,您必须为列提供相同的名称,如下所示:

而不是使用:

SELECT * FROM videos  
SELECT * FROM tableOfContents

使用这样的东西:

SELECT name as col_name, title as col_title, image as col_image FROM videos
SELECT name as col_name, titlesss as col_title, imagesss as col_image FROM tableOfContents

您可以为新列名使用任何给定名称。
这样,你就有了相同的列名,然后你可以像这样使用联合:

SELECT name as col_name, title as col_title, image as col_image, 'First_Table' as table_name FROM videos
INNER JOIN programas_videos ON videos.id_video = programas_videos.id_video 
INNER JOIN programas ON programas_videos.id_prog = programas.id_prog 
WHERE programas.nombre_prog LIKE "%'.$palabra_buscar.'%" 
OR programas.descrip_larga LIKE "%'.$palabra_buscar.'%" 
OR videos.descrip_larga LIKE "%'.$palabra_buscar.'%" 
GROUP BY videos.id_video DESC LIMIT 10
union
SELECT name as col_name, titlesss as col_title, imagesss as col_image, 'Second_Table' as table_name  FROM tableOfContents
WHERE tableOfContents .titulo LIKE "%'.$palabra_buscar.'%" 
OR tableOfContents.descripcion LIKE "%'.$palabra_buscar.'%" 
OR tableOfContents.categoria LIKE "%'.$palabra_buscar.'%" 
GROUP BY tableOfContents.titulo  LIMIT 10

我添加了table_name 字段,以便您可以区分来自不同表的行。

您可以根据需要使用任意多个unions。 here you can find the complete union syntax

【讨论】:

    【解决方案2】:

    经过简短的 google 搜索后,您可以找到关于子查询的 article 或关于 UNION 的 article

    在我看来,您应该选择 Union,但您需要确保从所有表格中以相同的顺序选择相同的 COLUMNS。您应该将子查询作为最后的选择。

    顺便说一句。您应该为 http://www.w3schools.com 添加书签,以供将来在基本的 Web 开发问题中参考。

    【讨论】:

    • 是的,我也做了一个简短的搜索,我建立了相同的,但不像那篇文章那么容易。
    • 顺序不一样,名字也不一样。
    • 那么,假设您可以访问数据库,您只需将所有表的列更改为相同即可。
    • 此外,您不应通过在末尾添加更多“ss”(即图像和图像ss)来区分列。如果确实需要有所不同,请使其更加明显和不言自明(例如 images-contentimages-video),如果没有,则为每个表格保留相同的内容.
    • 您还可以使用 AS 运算符为您的列添加别名 - SELECT imagessss 作为图像,videoss 作为视频 FROM... 订购也是如此,您可以轻松交换SELECT 语句中列的顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2014-06-23
    • 1970-01-01
    相关资源
    最近更新 更多