2013-10-29 71 views
0

我有一个MySQL查询问题。我建立了一张跟踪高中足球比分的桌子。它看起来像这样:选择MySQL CASE语句

CREATE TABLE `games` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `home_team` int(11) NOT NULL, 
    `visitor_team` int(11) NOT NULL, 
    `home_score` tinyint(4) NOT NULL, 
    `visitor_score` tinyint(4) NOT NULL, 
    `quarter` tinyint(4) NOT NULL, 
    `week` tinyint(2) NOT NULL, 
    `game_date` date NOT NULL, 
    `game_time` time NOT NULL, 
    `complete` tinyint(4) NOT NULL DEFAULT '0', 
    `stadium_id` int(11) NOT NULL, 
    `created_at` datetime NOT NULL, 
    `updated_at` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=151; 

我正在做的查询使用团队的id进行比较。我想要检索给定团队id唯一击败的团队的id值。这是我的查询到目前为止。

SELECT 
    CASE 
     WHEN games.home_team != ? AND (games.home_score > games.visitor_score) THEN games.home_team 
     WHEN games.visitor_team != ? AND (games.home_score < games.visitor_score) THEN games.visitor_team 
    END AS id, teams.class_id, classes.name 
FROM games 
    INNER JOIN teams ON id = teams.id 
    INNER JOIN classes ON teams.class_id = class.id 
    WHERE games.complete = 1 

当我运行在PHP MyAdmin此查询我得到以下错误:

#1052 - Column 'id' in on clause is ambiguous 

我使用的PDO的execute()这样的代表队ID值?因为我将CASE语句的结果分配给了id,所以我可以用它来加入团队表。有人能指出我正确的方向来解决这个错误吗?先谢谢你。

+0

不能在'ON'或中引用列别名'WHERE'条款。你将不得不重复'CASE'表达式。 – eggyal

回答

3

您需要在存在于多个表中的列前为使用表名,或使用一个别名:

INNER JOIN teams ON games.id = teams.id 

编辑:说了这么多,似乎它实际上是一个列别名,你不能做的是:

INNER JOIN teams ON 
CASE 
    WHEN games.home_team != ? AND (games.home_score > games.visitor_score) THEN games.home_team 
    WHEN games.visitor_team != ? AND (games.home_score < games.visitor_score) THEN games.visitor_team 
END = teams.id 

你也可以先使用子查询,然后匹配的结果没有额外的case语句。

Select 
    sub.id, 
    teams.class_id, 
    classes.name 
from 
    (
     SELECT 
      CASE 
      WHEN games.home_team != ? AND (games.home_score > games.visitor_score) THEN games.home_team 
      WHEN games.visitor_team != ? AND (games.home_score < games.visitor_score) THEN games.visitor_team 
      END AS id 
     FROM 
      games 
     WHERE 
      games.complete = 1 
    ) sub 
    INNER JOIN teams ON sub.id = teams.id 
    INNER JOIN classes ON teams.class_id = class.id 
+0

我运行你的例子,并意识到我的逻辑关闭。修好后,一切看起来都不错。您会根据性能推荐哪种方法? – WebDev84

+0

@ RCM8402性能将有* LOT *与您的数据库,并不是任何人都可以简单地说“使用方法x”...运行一些测试,使用两种方法粉碎数据库,看看哪一个举起来更好。改变表格中的数据量,使用最适合你的方法:) – Fluffeh

0

我做了一个简单的函数来做到这一点。它工作。

// get variable 
$area = $_GET['area']; 

// function 
function cases($a) { 

    $sel_dash = mysql_query("SELECT * FROM sys_dash WHERE area = '$a'"); 
    $dados = mysql_fetch_assoc($sel_dash); 
    $page = $dados['page']; 

    return $page; 
} 

// call function with the variable 
$page = cases($area); 

为了测试是否是你it's值修正你可以改变“返回”到“回声”和变量将在代码中编写。

我用的表是:

CREATE TABLE `sys_dash` (
    `id` INT(10) NOT NULL AUTO_INCREMENT, 
    `area` VARCHAR(250) NOT NULL, 
    `page` VARCHAR(250) NOT NULL, 
    PRIMARY KEY (`id`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB 
ROW_FORMAT=DEFAULT 

我希望我的帮助!

它是PHP的CASE类,但具有我需要的相同功能。

感谢

Doniani