【问题标题】:MYSQL querying two tables with different fieldsMYSQL查询具有不同字段的两个表
【发布时间】:2012-02-27 03:49:41
【问题描述】:

这是我的搜索查询,它输出了一个参数错误。
我需要做什么来纠正它。基本上我需要将这两个表放在一起,并在start 日期之前提取两个表中接下来的 5 个事件。您还会注意到每个表中的最后一个字段彼此不同。

$CEsql = mysql_query("
  SELECT id, title, start, end, allDay
  FROM calendar 
  WHERE mem_id='$logOptions_id' 
    AND start >= DATE_SUB( CURDATE( ) ,INTERVAL 0 MONTH ) 
  
  UNION ALL 

  SELECT id, title, start, end, allDay
  FROM team_calendar 
  WHERE team_id IN ($team_array) 
    AND start >= DATE_SUB( CURDATE( ) ,INTERVAL 0 MONTH ) 
  ORDER BY start ASC LIMIT 5");

我正在使用 MYSQL 5.0 和 PHP。

更新

mysql_error 显示:

1267:操作“UNION”的排序规则的非法混合

【问题讨论】:

  • @Dagon:显然你需要猜测
  • @Dagon mysql_fetch_array() 提供的参数不是有效的 mysql 结果资源
  • @Juan Gonzales:使用mysql_error(),下次在 mysql 控制台或 PMA 中检查您的每个查询(在您在这里询问之前)以检查查询是否正确
  • 我认为人们认为 php 和 mysql 是一回事,因此 mysql 的错误应该显示为 php 的错误;或者他们只是愚蠢!
  • 两个表\字段需要相同的排序规则才能使联合工作

标签: php mysql mysql-error-1267


【解决方案1】:

请检查 WHERE 子句。使用 mem_id 而不是 id2。 id2 只是别名而不是字段名。

$CEsql = mysql_query("
  SELECT id, title, start, end, allDay, mem_id as id2 
  FROM calendar 
  WHERE mem_id='$logOptions_id' 
    AND start >= DATE_SUB( CURDATE( ) ,INTERVAL 0 MONTH ) 

  UNION ALL 

  SELECT id, title, start, end, allDay, team_id as id2 
  FROM team_calendar 
  WHERE team_id IN ($team_array) 
    AND start >= DATE_SUB( CURDATE( ) ,INTERVAL 0 MONTH ) 
  ORDER BY start ASC LIMIT 5");

【讨论】:

  • @JuanGonzales 在任何 sql 编辑器中运行此查询,并显示错误消息。
  • 错误是 - 操作“UNION”的排序规则的非法混合
  • @JuanGonzales 检查 varchar 字段的排序规则(任何相关的文本类型)。在这里它应该在标题字段中。确保 calendar 和 team_calendar 表中 title 字段的排序规则相同。
  • 显然不是,否则您不会收到错误,它的 Collat​​ion 不是类型,它的字段和表格都没有。
  • 从查询字符串中删除“title”并尝试查询。它是否显示任何错误
【解决方案2】:

为两个表运行 SHOW CREATE TABLE 语句。查找两个表之间的差异,按照 Leap Bun 的建议检查字符集和排序规则。然后您可以更改字段字符集/排序规则,或者只是尝试在您的 SELECT 查询中使用 COLLATE 子句。像这样 -

SELECT id, title, start, end, allDay
  FROM calendar 
  WHERE mem_id='$logOptions_id' 
    AND start >= DATE_SUB( CURDATE( ) ,INTERVAL 0 MONTH ) 

  UNION ALL 

  SELECT id, 
    title COLLATE collation_name AS title, -- write your collation here
    start, end, allDay
  FROM team_calendar 
  WHERE team_id IN (1,2) 
    AND start >= DATE_SUB( CURDATE( ) ,INTERVAL 0 MONTH ) 
  ORDER BY start ASC LIMIT 5

【讨论】:

    猜你喜欢
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    相关资源
    最近更新 更多