我想知道是否有任何可以帮助我理解我想要解决的问题。
我正在使用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
答案 0 :(得分:2)
查看Wordpress extension后,我认为eg_nggcf_fields
是包含自定义字段名称的表。 eg_nggcf_field_values
表包含每张图片的自定义字段的值。
因此,如果您要查找名为moviename
和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'
答案 1 :(得分:1)
首先,我建议坚持使用JOIN表的现代ANSI语法,这意味着使用JOIN子句。
而不是使用:
FROM table1, table2 WHERE table1.id = table2.pid
使用:
FROM Table 1 JOIN table2 ON table1.id = table2.id
为简单起见,我还建议您使用别名表,因为这会使代码更具可读性。您不必每次都写出egg_ngg_pictures
,而是简单地引用您指定的别名。
最后,当您使用LIKE
运算符时,通常会添加一个通配符(通常为%
。即LIKE '%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小提琴,我会尝试使用它来处理它。