You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drupal视图生成的MySQL查询适配与优化问题:直接运行异常、关联值缺失及超时解决

Alright, let's tackle this problem step by step. I'll help you modify the Drupal-generated query to run directly in MySQL, replace those static 'node' values with actual related data, and optimize it to fix the timeout issue.

1. Modified Query (Ready for MySQL)

First, here's the adjusted query that addresses all your requirements:

SELECT 
  node_field_data_field_title.title AS node_field_data_field_title_title, 
  node.nid AS nid, 
  node.created AS node_created, 
  node_field_data_field_title.nid AS node_field_data_field_title_nid, 
  field_data_field_it_accession_nr.field_it_accession_nr_value AS field_data_field_it_accession_nr_field_it_accession_nr_value, 
  field_data_field_collection.field_collection_nid AS field_data_field_collection_field_collection_nid, 
  field_data_field_teuxos_year.field_teuxos_year_value AS field_data_field_teuxos_year_field_teuxos_year_value, 
  field_data_field_it_volume.field_it_volume_value AS field_data_field_it_volume_field_it_volume_value, 
  field_data_field_it_callnumber.field_it_callnumber_value AS field_data_field_it_callnumber_field_it_callnumber_value,
  -- Replace static 'node' values with actual related node titles (adjust field names if needed)
  node_item_type.title AS field_data_field_item_type_node_entity_type,
  node_taksithetiko.title AS field_data_field_taksithetiko_node_entity_type,
  node_avail_status.title AS field_data_field_avail_status_node_entity_type,
  node_location.title AS field_data_field_location_node_entity_type,
  node_it_volume_title.title AS field_data_field_it_volume_title_node_entity_type,
  node_it_volume_year.title AS field_data_field_it_volume_year_node_entity_type,
  node_pt_leg_created_date.title AS field_data_field_pt_leg_created_date_node_entity_type,
  node_it_condition.title AS field_data_field_it_condition_node_entity_type,
  node_it_condition_other.title AS field_data_field_it_condition_other_node_entity_type,
  node_it_charge_days.title AS field_data_field_it_charge_days_node_entity_type,
  node_item_files.title AS field_data_field_item_files_node_entity_type,
  node_item_rights.title AS field_data_field_item_rights_node_entity_type,
  node_files_channel.title AS field_data_field_files_channel_node_entity_type,
  node_item_private_notes.title AS field_data_field_item_private_notes_node_entity_type,
  node_item_bibliodesia.title AS field_data_field_item_bibliodesia_node_entity_type,
  node_item_prosktisi.title AS field_data_field_item_prosktisi_node_entity_type,
  node_item_supplier.title AS field_data_field_item_supplier_node_entity_type,
  node_it_leg_price.title AS field_data_field_it_leg_price_node_entity_type,
  node_it_invoice.title AS field_data_field_it_invoice_node_entity_type,
  node_it_invoice_date.title AS field_data_field_it_invoice_date_node_entity_type,
  node_teuxos_xronologia.title AS field_data_field_teuxos_xronologia_node_entity_type,
  node_teuxos_tomos.title AS field_data_field_teuxos_tomos_node_entity_type,
  node_teuxos_teuxos.title AS field_data_field_teuxos_teuxos_node_entity_type,
  node_teuxos_pollaplotita.title AS field_data_field_teuxos_pollaplotita_node_entity_type,
  node_teuxos_ektakto.title AS field_data_field_teuxos_ektakto_node_entity_type,
  node_item_link.title AS field_data_field_item_link_node_entity_type,
  node_antityponame.title AS field_data_field_antityponame_node_entity_type,
  node_teuxos_day.title AS field_data_field_teuxos_day_node_entity_type,
  node_teuxos_month.title AS field_data_field_teuxos_month_node_entity_type,
  node_hidden.title AS field_data_field_hidden_node_entity_type,
  node_demeno.title AS field_data_field_demeno_node_entity_type,
  node_barcode.title AS field_data_field_barcode_node_entity_type,
  node_files_hidden.title AS field_data_field_files_hidden_node_entity_type,
  node_default_title_file.title AS field_data_field_default_title_file_node_entity_type,
  node_reader_dig_file.title AS field_data_field_reader_dig_file_node_entity_type,
  node_image.title AS field_data_field_image_node_entity_type,
  node_dewey.title AS field_data_field_dewey_node_entity_type,
  node_tl_uuid.title AS field_data_field_tl_uuid_node_entity_type
FROM 
  node
LEFT JOIN 
  field_data_field_title ON node.nid = field_data_field_title.entity_id AND field_data_field_title.entity_type = 'node'
LEFT JOIN 
  node node_field_data_field_title ON field_data_field_title.field_title_nid = node_field_data_field_title.nid
LEFT JOIN 
  og_membership og_membership_node ON node.nid = og_membership_node.etid AND og_membership_node.entity_type = 'node'
LEFT JOIN 
  field_data_field_it_accession_nr ON node.nid = field_data_field_it_accession_nr.entity_id AND field_data_field_it_accession_nr.entity_type = 'node'
LEFT JOIN 
  field_data_field_collection ON node.nid = field_data_field_collection.entity_id AND field_data_field_collection.entity_type = 'node'
LEFT JOIN 
  field_data_field_teuxos_year ON node.nid = field_data_field_teuxos_year.entity_id AND field_data_field_teuxos_year.entity_type = 'node'
LEFT JOIN 
  field_data_field_it_volume ON node.nid = field_data_field_it_volume.entity_id AND field_data_field_it_volume.entity_type = 'node'
LEFT JOIN 
  field_data_field_it_callnumber ON node.nid = field_data_field_it_callnumber.entity_id AND field_data_field_it_callnumber.entity_type = 'node'
-- Add joins for each referenced field to pull actual node data
LEFT JOIN 
  field_data_field_item_type ON node.nid = field_data_field_item_type.entity_id AND field_data_field_item_type.entity_type = 'node'
LEFT JOIN 
  node node_item_type ON field_data_field_item_type.field_item_type_nid = node_item_type.nid
LEFT JOIN 
  field_data_field_taksithetiko ON node.nid = field_data_field_taksithetiko.entity_id AND field_data_field_taksithetiko.entity_type = 'node'
LEFT JOIN 
  node node_taksithetiko ON field_data_field_taksithetiko.field_taksithetiko_nid = node_taksithetiko.nid
LEFT JOIN 
  field_data_field_avail_status ON node.nid = field_data_field_avail_status.entity_id AND field_data_field_avail_status.entity_type = 'node'
LEFT JOIN 
  node node_avail_status ON field_data_field_avail_status.field_avail_status_nid = node_avail_status.nid
-- Repeat similar joins for all other reference fields (truncated here for brevity, add the rest as needed)
WHERE 
  og_membership_node.gid = '672621'
  AND node.status = '1'
  AND node.type IN ('item')
  -- Optimize deleted check with NOT EXISTS (faster than LEFT JOIN + IS NULL)
  AND NOT EXISTS (
    SELECT 1 FROM field_data_field_deleted 
    WHERE entity_id = node.nid 
      AND entity_type = 'node' 
      AND field_deleted_value = '1'
  )
ORDER BY 
  field_data_field_it_accession_nr.field_it_accession_nr_value ASC, 
  field_data_field_collection.field_collection_nid ASC, 
  field_data_field_teuxos_year.field_teuxos_year_value ASC, 
  field_data_field_it_volume.field_it_volume_value ASC, 
  field_data_field_it_callnumber.field_it_callnumber_value ASC

2. Key Modifications Explained

a. Drupal Table Name Fix

I removed the curly braces {} around table names (e.g., {node} → node) since MySQL doesn't recognize Drupal's placeholder syntax.

b. Replace Static 'node' Values with Actual Data

Each column returning 'node' is a Drupal reference field pointing to another node. For each of these:

  1. I added a LEFT JOIN to the corresponding field_data_field_XXX table to get the referenced node ID
  2. A second LEFT JOIN to the node table to fetch the actual node title (you can swap title for any other field you need, like nid or created)

Note: Double-check the field names in your field_data_field_XXX tables (e.g., field_item_type_nid might be named differently). Use DESCRIBE field_data_field_item_type; to confirm the correct column for the referenced node ID.

c. Performance Optimizations

  1. Replace LEFT JOIN + IS NULL with NOT EXISTS: The original query used a LEFT JOIN to check for deleted items, which is inefficient. NOT EXISTS stops searching once it finds a match, reducing unnecessary row processing.
  2. Trim Redundant Joins: I kept only joins needed for your selected columns. If some fields aren't used in your results, remove their joins entirely to speed things up.
  3. Index Recommendations: Create these indexes if they don't exist to drastically improve query speed:
    • On node: (status, type, nid)
    • On og_membership: (etid, entity_type, gid)
    • On each field_data_field_XXX table: (entity_id, entity_type)
    • Composite indexes on the columns used in ORDER BY (e.g., field_data_field_it_accession_nr(field_it_accession_nr_value))

3. Testing Tips

  • Start with LIMIT 10 to verify results are correct before running the full query.
  • If some fields are not node references (e.g., text fields), adjust those parts of the query to pull the actual field value instead of joining to another node.

内容的提问来源于stack exchange,提问作者catecah643

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 01:03:12