1

我想知道是否有任何人可以帮助我理解我要解决的问题。

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

我有一个图片库,它们是广告框,我需要根据提供的电影名称提取这些图片,为此我在广告图片上使用了一些名为“adlink”(链接关闭广告)和广告的自定义字段

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

ngg_pictures、nggcf_field_values 和 nggcf_fields。

nggcf 表是自定义字段表,

到目前为止,我可以在两个单独的查询中得到我需要的东西,但是我不能将它们组合成一个查询,因为这意味着查询 nggcf_field_values 表两次,我似乎无法对其进行排序。

我已经硬编码了 mo 中的搜索条件,但是“close-encounters”位将是一个传递的 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

4

2 回答 2

2

查看Wordpress 扩展后,我认为这eg_nggcf_fields是包含自定义字段名称的表。该eg_nggcf_field_values表包含每张图片的自定义字段的值。

因此,如果您要查找名为movienameand的两个字段adlink,则必须在表中查找两行field_values。如果你给它一个不同的别名,你可以加入一个表两次:

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'
于 2012-12-31T12:56:16.640 回答
1

首先,我建议对 JOINing 表坚持现代 ANSI 语法,这意味着使用 JOIN 子句。

而不是使用:

FROM table1, table2 WHERE table1.id = table2.pid

采用:

FROM Table 1 JOIN table2 ON table1.id = table2.id

为简单起见,我还建议您使用别名表,因为这会使代码更具可读性。不必egg_ngg_pictures每次都写出来,您可以简单地引用您为其分配的别名。

最后,当您使用LIKE运算符时,通常会添加一个通配符(通常是%.ieLIKE '%123'LIKE '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_encounters”值检索到的 field_Values.PID 上的连接应该已经存在。

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

于 2012-12-31T12:56:15.450 回答