MySql多表查询

MySql多表查询,mysql,Mysql,我想知道是否有人能帮助我理解我正在试图解决的问题 我正在wordpress网站上工作,但这更像是一个sql问题,因为我只是在模板文件中查询以获得一些结果 我有一个图片库,这些图片是广告框,我需要拉这些与提供的电影名称,要做到这一点,即时通讯使用一些自定义字段上的广告图片称为'广告链接'(链接关闭广告)和广告 我正在使用nextgen gallery插件查询这些表,总共有三个表包含我需要查询的数据 ngg_图片、nggcf_字段值和nggcf_字段 nggcf表是自定义字段表 到目前为止,我可以在

我想知道是否有人能帮助我理解我正在试图解决的问题

我正在wordpress网站上工作,但这更像是一个sql问题,因为我只是在模板文件中查询以获得一些结果

我有一个图片库,这些图片是广告框,我需要拉这些与提供的电影名称,要做到这一点,即时通讯使用一些自定义字段上的广告图片称为'广告链接'(链接关闭广告)和广告

我正在使用nextgen gallery插件查询这些表,总共有三个表包含我需要查询的数据

ngg_图片、nggcf_字段值和nggcf_字段

nggcf表是自定义字段表

到目前为止,我可以在两个单独的查询中获得所需的内容,但我不能将它们组合到一个查询中,因为这意味着要查询两次nggcf_field_values表,而我似乎无法排序

我已经为mo硬编码了搜索条件,但是“亲密接触”位将是传递的var,“156”将是第一次查询的pid

SELECT `eg_ngg_pictures`.`filename`, `eg_nggcf_field_values`.`fid`, `eg_nggcf_field_values`.`pid`
FROM eg_ngg_pictures, eg_nggcf_field_values
WHERE ((`eg_nggcf_field_values`.`field_value` LIKE 'close-encounters') AND (`eg_nggcf_field_values`.`pid` = eg_ngg_pictures.pid))



SELECT `eg_nggcf_field_values`.`field_value`
FROM eg_nggcf_field_values, eg_nggcf_fields
WHERE ((`eg_nggcf_fields`.`field_name` = 'adlink') AND (`eg_nggcf_fields`.`id` = eg_nggcf_field_values.fid) AND (`eg_nggcf_field_values`.`pid`  = '156'))

任何帮助都将不胜感激,我可以用我所拥有的获得结果,但我想了解如何将这两者结合起来,编写更好的SQl。感谢MRO首先,我建议使用现代ANSI语法连接表,这意味着使用JOIN子句

而不是使用:

FROM table1, table2 WHERE table1.id = table2.pid
使用:

为了简单起见,我还建议您使用别名表,因为这会使代码更具可读性。您无需每次都写出
egg\ngg\u图片
,只需参考您指定的别名即可

最后,当您使用
LIKE
运算符时,通常会添加通配符(通常是
%
。即
像“%123”
像“123%”
)。您似乎只寻找完整的匹配项,这意味着您可以坚持使用
=
,因为这会使您的性能稍好一些

现在,为了重写您的查询,我将使用如下内容:

SELECT 
    pic.filename
    , fieldval.fid
    , fieldval.pid
    , fieldval.field_value
FROM 
    eg_ngg_pictures pic
        JOIN eg_nggcf_field_values fieldval ON fieldval.pid = pic.pid
        JOIN eg_nggcf_fields fields ON fields.id = fieldval.fid
WHERE 
    ((fieldval.field_value = 'close-encounters') 
    AND fields.field_name = 'ad_link'
请注意,我无法测试查询,因为我没有您的模式。但是,通过将两个查询合并到一个查询中,使用“close_Conferences”值检索的字段_Values.PID上的联接应该已经存在

如果查询不起作用,请随意创建一个包含相关表和一些数据的SQL FIDLE,我将尝试让它起作用。

查看后,我认为
例如_nggcf_字段
是包含自定义字段名称的表。
eg_nggcf_field_values
表包含每张图片的自定义字段值

因此,如果要查找名为
moviename
adlink
的两个字段,则必须在
字段值表中查找两行。如果为表指定不同的别名,则可以将其联接两次:

select  pic.filename
,       pic.pid
,       fv1.field_value as MovieName
,       fv2.field_value as Adlink
from    eg_ngg_pictures pic
inner join -- Find ID for the field called 'moviename'
        eg_nggcf_fields f1
on      f1.field_name = 'moviename'
inner join -- Find value for field moviename for this picture
        eg_nggcf_field_values as fv1
on      fv1.pid = pic.pid
        and fv1.fid = f1.fid
inner join -- Find ID for the field called 'adlink'
        eg_nggcf_fields f2
on      f2.field_name = 'adlink'
inner join -- Find value for field adlink for this picture
        eg_nggcf_field_values as fv2
on      fv2.pid = pic.pid
        and fv2.fid = f2.fid
where   fv1.field_value like 'close-encounters'

了解左连接、内连接和外连接。我相信它会做你想做的事。是一个链接谢谢,看起来真的很有用-我来看看。嗨,非常感谢-这真的很有用,我一直在玩sql fiddle(谢谢提示),但它还没有玩,这里是我到目前为止的
select  pic.filename
,       pic.pid
,       fv1.field_value as MovieName
,       fv2.field_value as Adlink
from    eg_ngg_pictures pic
inner join -- Find ID for the field called 'moviename'
        eg_nggcf_fields f1
on      f1.field_name = 'moviename'
inner join -- Find value for field moviename for this picture
        eg_nggcf_field_values as fv1
on      fv1.pid = pic.pid
        and fv1.fid = f1.fid
inner join -- Find ID for the field called 'adlink'
        eg_nggcf_fields f2
on      f2.field_name = 'adlink'
inner join -- Find value for field adlink for this picture
        eg_nggcf_field_values as fv2
on      fv2.pid = pic.pid
        and fv2.fid = f2.fid
where   fv1.field_value like 'close-encounters'