MySQL:如何构造给定的查询

时间:2013-11-04 22:17:17

标签: mysql

我根本不是MySQL大师,如果有人花些时间来帮助我,我真的很感激。我有三个表格如下所示:

TEAM(teamID, teamName, userID)
YOUTH_TEAM(youthTeamID, youthTeamName, teamID)
YOUTH_PLAYER(youthPlayerID, youthPlayerFirstName, youthPlayerLastName, youthPlayerAge, youthPlayerDays, youthPlayerRating, youthPlayerPosition, youthTeamID)

这是我现在的查询:

SELECT team.teamName, youth_team.youthTeamName, youth_player.*
FROM youth_player
    INNER JOIN youth_team ON youth_player.youthTeamID = youth_team.youthTeamID
    INNER JOIN team ON youth_team.teamID = team.teamID
WHERE youth_player.youthPlayerAge < 18
AND youth_player.youthPlayerDays < 21
AND youth_player.youthPlayerRating >= 5.5

我想在此查询中添加的内容如下所示:

  • 如果玩家有16年,并且他的位置是得分手,那么玩家应该至少有7个等级才能被退回
  • 如果玩家有15年,并且他的位置是组织者,那么玩家应该至少有5.5等级才能被退回
  • 等等。

如何在我的查询中实现这些要求(如果可能),并且该查询是否是一种糟糕的解决方案?如果我使用PHP代码进行选择(如果我们假设我使用PHP)而不是在查询中进行选择,它可能会更好吗?

2 个答案:

答案 0 :(得分:1)

在查询中执行它是非常好的......只要它不会太乱。您可以在查询中执行大量操作,但可能难以维护。因此,如果它太长并且您希望其他人看一下它,您应该将其拆分或在您的php脚本中找到解决方案。

至于你的要求,你也可以添加你的WHERE部分:

AND 
(
    (YOUTH_PLAYER.youthPlayerAge >= 16 AND YOUTH_PLAYER.youthPlayerPosition = 'scorer' AND YOUTH_PLAYER.youthPlayerRating >= 7)
    OR (YOUTH_PLAYER.youthPlayerAge >= 15 AND YOUTH_PLAYER.youthPlayerPosition = 'playmaker' AND YOUTH_PLAYER.youthPlayerRating >= 5.5)
)

答案 1 :(得分:1)

这是一个可能的解决方案,附带“标准/过滤器”表:

-- SAMPLE TEAMS: Yankees, Knicks:
INSERT INTO `team` VALUES (1,'Yankees',2),(2,'Knicks',1);

-- SAMPLE YOUTH TEAMS: Yankees Juniors, Knicks Juniors
INSERT INTO `youth_team` VALUES (1,'Knicks Juniors',1),(2,'Yankees Juniors',2);

-- SAMPLE PLAYERS
INSERT INTO `youth_player` VALUES       
  (1,'Carmelo','Anthony',16,20,7.5,'scorer',1),
  (2,'Amar\'e','Stoudemire',17,45,5.5,'playmaker',1),
  (3,'Iman','Shumpert',15,15,6.1,'playmaker',1),
  (4,'Alex','Rodriguez',18,60,3.5,'playmaker',2),
  (5,'Hiroki','Kuroda',16,17,8.7,'scorer',2),
  (6,'Ichiro','Suzuki',19,73,8.3,'playmaker',2);

-- CRITERIA TABLE
CREATE TABLE `criterias` (
  `id` int(11) NOT NULL,
  `age` int(11) DEFAULT NULL,
  `position` varchar(45) DEFAULT NULL,
  `min_rating` double DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- SAMPLE CRITERIAS
-- AGE=16, POSITION=SCORER, MIN_RATING=7
-- AGE=15, POSITION=PLAYMAKER, MIN_RATING=5.5
INSERT INTO `criterias` VALUES (1,16,'scorer',7), (2,15,'playmaker',5.5);

现在您的查询可能如下所示:

SELECT team.teamName, youth_team.youthTeamName, youth_player.*
FROM youth_player
    CROSS JOIN criterias
    INNER JOIN youth_team ON youth_player.youthTeamID = youth_team.youthTeamID
    INNER JOIN team ON youth_team.teamID = team.teamID
WHERE 
(
    youth_player.youthPlayerAge < 18
    AND youth_player.youthPlayerDays < 21
    AND youth_player.youthPlayerRating >= 5.5
) 
AND
(
    youth_player.youthPlayerAge = criterias.age
    AND youth_player.youthPlayerPosition = criterias.position
    AND youth_player.youthPlayerRating >= criterias.min_rating
)

这会产生(缩短的结果):

teamName  youthTeamName     youthPlayerName   Age   Days  Rating  Position   
=============================================================================
Yankees   "Knicks Juniors"  Carmelo Anthony   16    20    7.5     scorer        
Yankees   "Knicks Juniors"  Iman Shumpert     15    15    6.1     playmaker   
Knicks    "Yankees Juniors" Hiroki Kuroda     16    17    8.7     scorer