0

私がやろうとしていることを説明するのは難しいので、1 つの Excel スプレッドシートから派生した 2 つのテーブルがあります。スプレッドシートは原因と結果を定義します。3 つの参照点があるため、1 つの表にすることはできません。

このスプレッドシートには、左側にイベントのリストがあり、上部に効果があります。これらは、イベントと一致する行/列に X を挿入することによって、互いに関連付けられます。したがって、交差する列/行はマトリックスを形成します。たとえば、イベントは可能性があります。「ライトスイッチをオンにする」。「X」が見つかるまで、この行をたどります。次に列を効果までたどると、「ライトが点灯する」と表示されます (実際にはそれよりも少し複雑です)。同じ行に X で定義された複数の効果が存在する可能性があります。

私のアイデアは、table1.* と table2.* を使用する where ステートメントにありましたが、行/列を検索するためのワイルドカードを探していましたが、調査の結果、これは mysql では不可能です。それ以降のすべての行/列の組み合わせに OR を使用しても機能しません。

テーブルの X 行/列部分をクエリする方法に少し困惑しているため、すべての X を検索した後、クエリの「例」結果部分のみが表示されます。以下の単一のクエリは成功しますが、table1.1- を検索する必要があります。 60 表 2.2-61 の「X」の出現については、Web ページの mysql/php タイプのフォームでクエリの「%example%」部分のみを変更し、結果を別のページに表示することによる

任意の提案/代替案を歓迎します

SELECT
table1.equipment,
table1.tagno,
table2.equipment,
table2.action,
table2.service,
table2.tagno
FROM
table1 ,
table2
WHERE
table1.tagno LIKE '%example%' AND
table1.1 = 'X' AND
table2.2 = 'X'
4

2 に答える 2

1

;の列Nからtable1N+1を結合する自然な方法はありません。table2結合を「手動で」指定する必要があります(またはプログラムで、どちらも醜いです)。

あなたが欲しい:

select * from table1 t1, table2 t2 
where t1.tagno like '%example%' AND t1.1 ='X' and t2.2 = 'X'
UNION
select * from table1 t1, table2 t2 
where t1.tagno like '%example%' AND t1.2 ='X' and t2.3 = 'X'
UNION
-- ...

これは非常に非効率的である可能性があります。コメントで示唆されているように、データをリモデリングすると、よりクリーンなクエリとより幸せな未来が得られます。

于 2012-05-20T17:36:45.830 に答える
0

私の提案をより深く理解するために、次のようにデータを再モデル化します。

CREATE TABLE effects (
         id INT,
         name VARCHAR(100)
       );

CREATE TABLE events (
         id INT,
         name VARCHAR(100)
       );

CREATE TABLE effects_events (
         effect_id INT,
         event_id INT
       );

Effects_events はジャンクション テーブルです

したがって、次のようにクエリできます。

SELECT * FROM events WHERE events.id = effects_events.event_id AND effects_events.effect_id = effects.id AND effects.name = 'light turns on';

または:

SELECT * FROM effects WHERE effects.id = effects_events.effect_id AND effects_events.event_id = events.id AND events.name = 'turn on lightswitch';

私はあなたの質問で何かを誤解しているかもしれませんが、これは私にとって最も簡単な解決策のようです.

于 2012-05-20T23:41:14.580 に答える