0

我正在做几个 MySQL 连接来获取模板变量(即自定义字段)和它们的值(在 MODX Evo 中,但这无关紧要——这是一个通用的 MySQL 查询)。

理想情况下,我希望能够创建 2 个临时列以便在查询中使用 SORT BY 或类似的东西。我想在这些新列中为它们对应的 id 填充 'event_date' 和 'event_featured' 的值 - 然后我可以按这些列对结果进行排序。

在一个非常相关的注释中,我想将每个唯一 id 的结果限制为 20,而不是像我添加 LIMIT 那样对每一行进行限制 - 它会将以下结果裁剪为 . 这可以同时实现吗?

任何人都知道如何/如果这些是可能的?提前谢谢了。

以下结果的代码和图像:

SELECT DISTINCT
    content.id, content.pagetitle, content.template , content.published,
    templates.templatename,
    tv_props.name,
    tv_values.value

FROM `modx_site_content` AS `content`
LEFT JOIN `modx_site_templates` AS `templates` ON content.template=templates.id
LEFT JOIN `modx_site_tmplvar_templates` AS `template_tvs` ON templates.id=template_tvs.templateid
LEFT JOIN `modx_site_tmplvars` AS `tv_props` ON template_tvs.tmplvarid=tv_props.id
LEFT JOIN `modx_site_tmplvar_contentvalues` AS `tv_values` ON template_tvs.tmplvarid=tv_values.tmplvarid

WHERE templates.id=89
AND (
    tv_props.name='event_featured'
OR tv_props.name='event_link_through'
OR tv_props.name='event_title'
OR tv_props.name='event_date'
OR tv_props.name='event_date_text'
OR tv_props.name='event_short_description'
OR tv_props.name='event_list_image'
);

链接到全尺寸图像 查询结果

4

1 回答 1

1

您将需要几个虚拟表(也称为子查询)来从名称/值表中检索事件的这两个属性。此类查询的通用名称是“枢轴”,供您参考。

诀窍是将子查询视为可以在周围查询中使用的虚拟表。event_date 的子查询看起来像这样,我相信。

      SELECT content.id        AS id,
     tv_values.value   AS event_date
        FROM modx_site_content               AS content
   LEFT JOIN modx_site_templates             AS templates 
      ON content.template=templates.id
   LEFT JOIN modx_site_tmplvar_templates     AS template_tvs 
      ON templates.id=template_tvs.templateid
   LEFT JOIN modx_site_tmplvars              AS tv_props 
      ON template_tvs.tmplvarid=tv_props.id
   LEFT JOIN modx_site_tmplvar_contentvalues AS tv_values 
      ON template_tvs.tmplvarid=tv_values.tmplvarid
       WHERE tv_props.name = 'event_date'

这个小查询会生成一个结果集,它是一个将内容 ID 与事件日期相关联的表格。老实说,我不太了解您的架构,无法知道每个内容 ID 是否只有一个事件日期,因此您可能需要调整此查询以选择更多列。在调试时,您应该尝试子查询并确保它给出了您希望的结果。

然后,当您确定子查询正常时,您将该子查询加入到您的整体查询中,通常是这样。

  SELECT DISTINCT
          content.id, event_date.event_date, templates.column,
          table.column, table.colum, etc, etc
     FROM modx_site_content AS content
    LEFT JOIN table ON condition
LEFT JOIN (
      SELECT content.id        AS id,
     tv_values.value   AS event_date
        FROM modx_site_content               AS content
   LEFT JOIN modx_site_templates             AS templates 
      ON content.template=templates.id
   LEFT JOIN modx_site_tmplvar_templates     AS template_tvs 
      ON templates.id=template_tvs.templateid
   LEFT JOIN modx_site_tmplvars              AS tv_props 
      ON template_tvs.tmplvarid=tv_props.id
   LEFT JOIN modx_site_tmplvar_contentvalues AS tv_values 
      ON template_tvs.tmplvarid=tv_values.tmplvarid
       WHERE tv_props.name = 'event_date'
     ) AS event_date ON event_date.id = content.id
LEFT JOIN etc, etc, etc.
    WHERE etc etc etc

你明白这是怎么回事吗?您可以使用tablename AS table(some query) AS table互换。您还可以VIEW在提供相同数据的架构中定义 a,并在查询中为其命名。这是一种使您的查询不那么繁琐的便捷方法。

顺便说一句,如果你改变,你会提高性能

AND (
    tv_props.name='event_featured'
 OR tv_props.name='event_link_through'
 OR tv_props.name='event_title' etc  )

 AND tv.props.name IN ('event_featured',
                       'event_link_through',
                       'event_title', etc)

您可能已经注意到我对 SQL 查询中的缩进有点执着。我觉得这很有帮助;我在修复缩进时经常会发现错误。您的做法可能会有所不同。

于 2013-06-27T18:15:10.907 回答