0

私は次の種類の設定をしています(少し単純化しすぎています):

配列 (php): array('a', 'b', 'c');

表 1:id値 (1)、(2)、(3)、(その他)。

表 2: id, idT1,value値 (1, 1, 'a'), (2, 1, 'b'), (3, 1, 'c'), (4, 2, 'c'), (5, 77, 'w') (その他).

テーブル 1 から行を選択する必要があります。テーブル 2 には、配列内のすべての値 (この場合は id col = 1 の行) が対応しています。

これを行う方法は次のようになります(可能性のあるタイプミスを無視してください)

 <?php
      $query = "SELECT * FROM `table1` WHERE `id` IN ";
      $subqr = "";
      foreach ($arr as $a) {
          if (!$subqr)
              $subqr = "(SELECT `idT1` FROM `table2` WHERE `value` = '$a')";
          else
              $subqr .= " AND `id` IN (SELECT `idT1` FROM `table2` WHERE `value` = '$a')";
      }

      ExecuteQuery($query.$subqr); // Where ExecuteQuery gets query as param.

今私の問題は...私は解決策に完全に満足していないということです...つまり...サブクエリを追加するforeachは最善のアプローチではない可能性があります。配列に 9999 個の要素がある場合... 9999 個のサブクエリは mysql を強制終了します。また、これは単純化しすぎていることに注意してください。

これを行う方法は他にありますか?

4

1 に答える 1

1

私が間違っている場合は修正してください。フィールドidT1のテーブル 2のIDを持つテーブル 1からすべてのレコードを選択する必要があります。その場合は、試すことができます

SELECT id
FROM table1
LEFT OUTER JOIN table2
ON table1.id=table2.idT1;

編集:

SELECT * 
FROM table1 
INNER JOIN table2 
ON table1.id=table2.idT1
WHERE table2.value IN ('a','b','c')
GROUP BY table1.id
HAVING COUNT(DISTINCT table2.value) = 3

最初に、行の配列をphp implodeを使用する必要があります

WHERE table2.value IN ('a','b','c')

次に、この行のphpカウント

HAVING COUNT(DISTINCT table2.value) = 3

それは3を置き換えるでしょう

于 2013-09-20T09:06:02.730 に答える