2

次のように2つのテーブルがあります:table1には次のフィールドがあります:

year,day,month,name

table2には次のフィールドがあります。

years,gift

year=yearsである行を返したい。2つのクエリを別々に実行する必要があります。これが条件です。私はそれらを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'];
}
4

1 に答える 1

3

これは、結合を使用して実行する必要があるため、奇妙な要件です。ループ内の複数のクエリでこれを行うことは、。を使用した単一のクエリよりもはるかに効率的ではありませんJOIN

いずれにせよ、この方法で行う必要がある場合は、最初のクエリから年を配列に正しく取得しました。その配列を使用して、2番目のクエリの各ループ反復のクエリにデータを入力します。

  $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.yearsはであると仮定して、それから年の部分のみを返し、それを現在の年と比較するために使用します。の年数に対してそれに参加します。DATEDATETIMEYEAR()YEAR(CURDATE())table1.year

SELECT 
  table1.*, 
  table2.*
FROM 
  table1
  JOIN table2 
    ON table1.year = (YEAR(CURDATE()) - YEAR(table2.years))
于 2012-07-01T19:14:54.340 に答える