我已将用于视图的SQL查询添加到MySQL并接收错误1064。
下面是我添加的SQL
SELECT field_data_field_session_start_date.delta AS field_data_field_session_start_date_delta, field_data_field_session_start_date.entity_id AS date_id_date_filter, field_data_field_session_start_date.delta AS date_delta_date_filter, node.title AS node_title, node.nid AS nid, node.language AS node_language, field_data_field_session_start_date.field_session_start_date_value AS field_data_field_session_start_date_field_session_start_date, 'node' AS field_data_field_session_start_date_node_entity_type
FROM
{node} node
LEFT JOIN {field_data_field_session_start_date} field_data_field_session_start_date
ON node.nid = field_data_field_session_start_date.entity_id AND (field_data_field_session_start_date.entity_type = 'node' AND field_data_field_session_start_date.deleted = '0')
WHERE (( (node.status = '1') )AND(( (DATE_FORMAT(field_data_field_session_start_date.field_session_start_date_value, '%Y-%m-%d') > '2014-03-24') )))
ORDER BY field_data_field_session_start_date_field_session_start_date ASC
LIMIT 3 OFFSET 0为什么会发生这样的错误?
发布于 2014-03-24 18:03:20
对于MySQL,不要将标识符括在大括号“{ }”中。(MySQL确实允许将大括号作为一些奇怪的外部联接语法{OJ }的一部分,但实际上没有调用使用该语法。1064消息的实际文本显示了MySQL看到问题的语句中的实际位置。(通常情况下,这并不是真正问题所在的地点,但这是一条线索。)
您的SQL语句很难破译;没有人能读懂它。
WHERE子句中所有不必要的括号并不能消除任何歧义,它们只是增加了混淆。
奇怪的是,您的查询指定了一个外部联接,但是联接的“外部性”被WHERE子句中的谓词所否定,因此它实际上是一个内部联接。这是误导。
更短的表别名确实可以使SQL更容易阅读,或者至少更容易被解密。
在另一个注意事项上,要启用索引用于日期时间列的范围扫描,请不要用函数包装日期列.这将禁用MySQL使用索引范围扫描的能力。
例如,MySQL不能使用索引范围扫描操作来满足以下谓词:
WHERE DATE_FORMAT( mydatetimecol, '%Y-%m-%d') > '2103-03-24'但是MySQL可以使用索引范围扫描来满足以下等价条件:
WHERE mydatetimecol >= '2103-03-24' + INTERVAL 1 DAY假设这个SQL返回一个等价的结果集..。
SELECT f.delta AS field_data_field_session_start_date_delta
, f.entity_id AS date_id_date_filter
, f.delta AS date_delta_date_filter
, n.title AS node_title
, n.nid AS nid
, n.language AS node_language
, f.field_session_start_date_value AS field_data_field_session_start_date_field_session_start_date
, 'node' AS field_data_field_session_start_date_node_entity_type
FROM `node` n
JOIN `field_data_field_session_start_date` f
ON f.entity_id = n.nid
AND f.entity_type = 'node'
AND f.deleted = '0'
AND f.field_session_start_date_value >= '2014-03-24' + INTERVAL 1 DAY
WHERE n.status = '1'
ORDER
BY f.field_session_start_date_value ASC
LIMIT 3 OFFSET 0https://stackoverflow.com/questions/22613635
复制相似问题