2

これはばかげているように聞こえますが、それは正当な(つまり過剰に設計された)原因のためであると私を信じてください。

テーブルについて何も知らなくても、そのテーブル内のすべてを選択するIN句を使用してSQLクエリを作成することは可能ですか?これは、テーブルを参照するサブクエリを使用できないことを意味することに注意してください。

つまり、次のクエリで「SOMETHING」を置き換えるステートメントを見つけたいと思います。

SELECT * FROM table_a WHERE table_a.id IN (SOMETHING)

結果が次のようになります。

SELECT * FROM table_a

「SOMETHING」の値を変更する以外に何もしないことによって


好奇心を満たすために、質問の理由を共有します。

1)2つのテンプレートメソッドgetData()とload()を使用して、ファクトリメソッドの魔法を拡張するすべてのモデルに付与するFactoryObject抽象クラスがあります。

2)モデルはテンプレートメソッドを実装する必要があります。getDataは、ID制約を受け入れ、データベースから行をプルし、連想配列のセットを返す静的メソッドです。loadは静的ではなく、連想配列を受け入れ、その配列に基づいてオブジェクトにデータを入力します。

3)FactoryObjectの非抽象部分は、getObject()およびgetObjects()メソッドを実装します。これらはgetDataを呼び出し、オブジェクトを作成し、getDataからの配列応答をloads()して、入力されたオブジェクトを作成して返します。

getObjects()は、リスト形式またはサブクエリ形式のいずれかの入力としてID制約を必要とし、これらはgetData()に渡されます。ID制約なしで渡して、すべてのオブジェクトを取得できるようにしたかったのです。

問題は、モデルだけがテーブルについて知っていることです。getObjects()はより高いレベルで実装されているため、INにユニバーサルな「すべてを返す」句がない限り、getData()を渡すものがわかりません。

他の解決策があります。APIを変更して、getDataが特別なパラメーターを受け入れてすべてを返すように要求するか、次を呼び出す静的getAll [ModelName] s()メソッドをモデルレベルで実装できます。

static function getAllModelObjects() {
    return getObjects("select [model].id from [model]");
}

これは合理的で、とにかくアーキテクチャに適合するかもしれませんが、私は興味があったので、私が尋ねると思いました!

4

5 に答える 5

4

SQL Serverで動作します:

SELECT * FROM table_a WHERE table_a.id IN (table_a.id)
于 2012-05-08T02:27:32.070 に答える
2

さて、私はノーと言うのが嫌いなので、私はあなたのために別の解決策を考え出さなければなりませんでした。

mysqlはオープンソースであるため、ソースを取得して、無限大記号を理解する新しい機能を組み込むことができます。次に、mysqlコミュニティにこの機能の有用性を受け入れてもらい(そうしようとすると、会話をセキュリティから可能な限り遠ざける)、会社にデータベース管理システムを新しいバージョンに一度アップグレードさせる必要があります。この機能は実装されています。

問題が解決しました。

于 2012-05-08T02:48:51.297 に答える
1

答えは簡単です。回避策は、次のようないくつかの基準を追加することです。

# to query on a number column
AND (-1 in (-1) OR sample_table.sample_column in (-1))  

# or to query on a string column
AND ('%' in ('%') OR sample_table.sample_column in ('%')) 

したがって、この例では、パラメータ値として-1を渡すとすぐに、次の2つのクエリが同じ結果を返すはずです。

SELECT * FROM table_a;
SELECT * FROM table_a WHERE (-1 in (-1) OR table_a.id in (-1));

そして、何かを除外したいときはいつでも、それをパラメーターとして渡すことができます。たとえば、次のクエリでは、IDが1、2、および6のレコードがフィルタリングされます。

SELECT * FROM table_a WHERE (-1 in (1, 2, 6) OR table_a.id in (1, 2, 6));

この場合、-1や%などのデフォルト値があり、任意のパラメータを使用できます。パラメータがデフォルト値の場合、何もフィルタリングされません。

テキスト列をクエリする場合はデフォルト値として%文字を、テーブルのPKをクエリする場合は-1をお勧めします。ただし、%または-1を、決定した予約文字または数字に置き換えるかどうかは、完全にあなた次第です。

于 2016-10-05T17:24:33.407 に答える
0

どうですか:

select * from table_a where table_a.id not ine ('somevaluethatwouldneverpossiblyexistintable_a.id')

編集:

私はあなたの問題を解決する方法を考え続けたいと思いますが、私は解決する方法がないことを知っているので、私は先に進んであなたに話す最初の人になると思います。答え。でもそれは本当にほろ苦い勝利です:/

あなたがより多くの情報を提供する場合、多分私または他の誰かがあなたが別の回避策を考えるのを手伝うことができます。

于 2012-05-08T02:32:17.283 に答える
0

@brandonmooreに似ています:

select * from table_a where table_a.id not in ('0') 
于 2012-05-08T02:34:11.630 に答える