【问题标题】:SQL While Loop DuplicatesSQL While 循环重复
【发布时间】:2013-05-21 08:55:15
【问题描述】:

我在我的 SQL while 循环中得到了这个:

PartID:1 Year:2003 ModelID:1375
PartID:1 Year:2004 ModelID:1375
PartID:1 Year:2005 ModelID:1375
PartID:2 Year:1995 ModelID:1244
PartID:2 Year:1996 ModelID:1244
PartID:2 Year:1997 ModelID:1244
PartID:2 Year:1998 ModelID:1244
PartID:2 Year:1999 ModelID:1244
PartID:2 Year:2000 ModelID:1244
PartID:2 Year:2001 ModelID:1244
PartID:2 Year:1996 ModelID:2361
PartID:2 Year:1997 ModelID:2361
PartID:2 Year:1998 ModelID:2361
PartID:2 Year:1999 ModelID:2361
PartID:2 Year:2000 ModelID:2361

但我需要这样的数据库插入(PartId、Start_Year、End_Year、ModelId):

PartID:1 Start Year:2003 End year:2005 ModelID:1375
PartID:2 Start Year:1995 End year:2001 ModelID:1244
PartID:2 Start Year:1996 End year:2000 ModelID:2361

您知道如何在 SQL While 循环或 SQL 查询中执行此操作吗?这些是表格:

型号2年

id | model_id | year
1          1        1966
2          2        1973
3          2        1972
4          2        1971
5          2        1970

model2year2part

id | model2year_id | part_id
1             9521              1
2             9520              1
3             9519              1
4             8637              2
5             8636              2

这些是示例表:

http://milversite.net/model2year.zip
http://milversite.net/model2year2part.zip

这是上面表的sql查询

$result = mysql_query("SELECT * FROM model2year JOIN model2year2part ON model2year2part.model2year_id = model2year.id");

while($row = mysql_fetch_array($result))
{
   $part_id = $row['part_id'];
   $year = $row['year'];
   $model_id = $row['model_id'];
   echo "PartID:$part_id Year:$year ModelID:$model_id<br>";
}

但我需要将其插入此结果表中,而不需要重复的 model_id,而不是年份范围为最小值。 model_id 的最大值:

结果表

part_id | model_id | start_year | end_year

谢谢!

【问题讨论】:

  • 请发布实际代码,而不仅仅是输出。
  • 为什么以 Codd 的名义在 SQL 中使用 while 循环?
  • 欢迎使用 *:如果您发布代码、XML 或数据示例,PLEASE 在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ }) 在编辑器工具栏上很好地格式化和语法突出显示它!这样,您也不需要大量凌乱的&lt;br&gt;&amp;nbsp; 标签!!

标签: sql loops while-loop duplicates


【解决方案1】:

将 GROUP BY 子句与聚合函数一起使用

SELECT Part_ID, Model_id,
       MIN(YEAR) AS Start_Year, MAX(YEAR) AS End_Year
FROM model2year JOIN model2year2part 
  ON model2year2part.model2year_id = model2year.id
GROUP BY Model_ID, Part_ID

【讨论】:

  • 谢谢亚历山大,你能不能用这个表测试它,因为我收到错误“mysql_fetch_array() 期望参数 1 是资源,布尔值”......这些是示例表:178.238.230.233/model2year.zip 178.238.230.233/model2year2part.zip
  • 谢谢。它可能有效,但由于 500MB 表“model2year2part”非常慢。有没有办法限制查询来测试它。我在 LIMIT 100 尝试过,但它仍在加载?
  • @NebojsaSta:这个查询非常简单明了:一方面,它没有多余的部分,另一方面,这里没有任何遗漏。它仅声明了服务器需要“知道”以解决问题的所有内容(如您的问题中所述)。性能是一个完全不同的问题,在我看来,应该作为一个新问题提出。您可能只需要添加适当的索引。我不确定是不是这样,或者哪个指数效果最好,但你可以在Database Administrators 上提问,据我所知,这是迄今为止提出这类问题的最佳地点。