【问题标题】:Check if the values of two columns from two tables are equal then return检查两个表中两列的值是否相等然后返回
【发布时间】:2012-07-02 08:17:51
【问题描述】:

我有 2 个表如下: table1 有这些字段:

year,day,month,name

table2 有这些字段:

years,gift

我想返回 year = 年的行。这两个查询需要单独运行,这是一个条件。 我不能将它们加入到 1 个查询中(我知道该怎么做,但不应该这样做)。有什么建议?我想过使用 foreach 循环但未能实现,有什么想法吗?

$sql1 = " SELECT * FROM table1 ORDER BY id ASC";
  $result1 = mysql_query($sql1);
  $rows = mysql_fetch_array($result1);
    while($rows = mysql_fetch_array($result1))
  { 
  $year[]         = $rows['year'];
}

$sqlx = "SELECT * FROM table2";
  $result = mysql_query($sqlx); 

  while($row = mysql_fetch_array($result))
    {
$years[]         = $rows['years'];
}

【问题讨论】:

  • 如果您想逐行测试结果,无论您是在 PHP 还是 MySQL 中进行,您最好在查询中添加 ORDER BY something。否则,你得到的只是不一致的结果。仅此而已。

标签: php mysql sql arrays multidimensional-array


【解决方案1】:

这是一个奇怪的要求,因为它应该通过连接来完成。在一个循环中使用多个查询执行此操作的效率远低于使用JOIN 的单个查询。

在任何情况下,如果您必须这样做,您已经从您的第一个查询中正确地将年份检索到一个数组中——使用该数组为您的第二个循环迭代填充查询查询:

  $year = array();
  $sql1 = " SELECT * FROM table1";
  $result1 = mysql_query($sql1);
  if ($result1) {
    $rows = mysql_fetch_array($result1);
    while($rows = mysql_fetch_array($result1))
    { 
      $year[] = $rows['year'];
    }
  }

  // Will hold your output
  $gifts = array();
  // $year is now an array of years.
  // Loop over it to query table2:
  foreach ($year as $y) {
    // Make sure it is an integer...
    $y = intval($y);
    // And query table2 using $y as a WHERE condition
    $sql2 = "SELECT years, gift FROM table2 WHERE years = $y";
    $result2 = mysql_query($sql2);
    if ($result2) {
       while($row = mysql_fetch_array($result2)) {
         // Append all rows to the $gifts array
         $gifts[] = $row;
       }
    }
  }

  // They're now all in the array $gifts.
  var_dump($gifts);

更新:

表 1 中的年份是以年为单位的时间段。表中的年份是创建帐户的日期。所以我必须在table2上找到今天日期与年份的差异。然后查看它是否与 table1 上的任何行匹配。并返回匹配的结果

这可以通过使用日期函数的创意JOIN 来完成。假设table2.yearsDATEDATETIME,使用YEAR() 仅返回其中的年份部分,并将其与当前年份的YEAR(CURDATE()) 进行比较。将其与table1.year 中的年数相加。

SELECT 
  table1.*, 
  table2.*
FROM 
  table1
  JOIN table2 
    ON table1.year = (YEAR(CURDATE()) - YEAR(table2.years))

【讨论】:

  • 是的,我需要在交叉匹配之前将 3 个函数应用于年份字段,substr 是其中之一,我知道它存在于 mysql 中,但我编写的其他 2 个函数我不确定是否可以通过 LEFT JOIN 完成所有操作
  • @fogsy 您通常可以加入反对函数调用的结果。如果你写的函数是字符串运算或者数值运算,很有可能在 SQL 中会出现重复。
  • @fogsy:如果您显示了 2 个表中的几行并描述了您希望如何匹配行(或函数的作用),您可以在 SQL 中得到答案。
  • @fogsy 使用天而不是年份更复杂,因为DAY() 仅返回当月的当前日期。如果它们总是在当前年份,您可以使用DAYOFYEAR(),如automail.days=(DAYOFYEAR(CURDATE()) - DAYOFYEAR(coverages.cvg_date))
  • @fogsy 不要使用 SUBSTRING() 来剥夺时间。使用 DATE() 仅返回 DATETIME 的日期部分。
猜你喜欢
  • 2012-01-10
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 2019-12-18
  • 2015-08-21
  • 2012-03-26
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多