0

MySQLの使用。

2つのテーブルがあります。表A、および表B。

テーブルAには、テーブルBに関連するIDを持ついくつかの値があります。このIDは、テーブルAではcrm_fieldとして、テーブルBではparent_idとして識別されます。

このクエリを実行してみました。

select * 
from tableA inner join tableB ON tableA.crm_field=tableB.parent_field 
WHERE tableA.id = '75' AND 
      tableA.category != 'null' AND 
      tableA.category != 'No Category'

私の期待する結果は、where要件を満たしたtableAのデータが、tableAのcrm_fieldの親IDと同等のparent_idを保持するtableBのデータとともに表示されることです。

実際の結果は、値を保持するparent_idを除いて、tableBが表示されます。また、crm_field=0およびparent_id=0の場合、crm_fieldがparent_idにもある22のような実際の値を持っている場合にクエリを実行したい場合に、クエリが実行されたようです。代わりにこれを試してみました:

select * 
from tableA inner join tableB ON tableA.crm_field=tableB.parent_field 
WHERE tableA.id = '75' AND 
      tableA.category != 'null' AND 
      tableA.category != 'No Category' AND 
      tableA.crm_field != '0'

しかし、それは私がtableAに追加する必要があるtableBからのデータだけを示しました。

結合クエリを使用してこれを行う方法はありますか?

そうでない場合は、二重クエリを実行することもできます。

ありがとう

サンプル出力:

tableA  
id|name|crm_field|category  
0|dog|0|hi  
1|cat|22|hi  
2|bear|0|null|  


tableB  
id|name|parent_id|  
0|wild|22|  
1|foo|0|  

表示は次のようになります。

0|dog|0|hi  
1|cat|22|hi  
2|wild|22  

-これが可能かどうか?

私がここで達成しようとしていることのポイントに到達するには、これがあります:

crm_fieldにはいくつかの値があります。

ただし、クエリでcrm_fieldに22または21、あるいはその両方が含まれている場合は、tableBにある対応する値が表示されます。

crm_field == 21または22の場合、これを実行したことを知っているため、対応する値を配列に追加するために別のクエリを実行します。しかし、私は可能な限り少ないコードでこれを達成したいので、私は結合を実験していました。

4

1 に答える 1

1

以下UNIONは、指定された入力の出力を取得します

SELECT  id, name, crmfield
FROM    TableA
WHERE   category != 'null'
UNION ALL
SELECT  a.id, b.name, a.crmfield
FROM    TableA AS a
        INNER JOIN TableB AS b ON b.parent_id = a.crm_field
WHERE   parent_id != '0'        

ただし、テーブルの設計にはいくつかの問題があります (JohnFx で既に述べたように)。

  • 'null'どのデータベースにも文字列値を格納しないでください。
  • リンク先の主キーとして外部キーに名前を付ける方が (少なくとも私にとっては) はるかに簡単です。parent_idにリンクされていることを知る方法はありませんcrm_field。そのリンクを明確にするために名前を変更TableB.parent_idすることをお勧めします。TableB.crm_field
  • TableB.foo結果にレコードが返されないようにします。それは奇妙に思えます。リレーションシップの一部のみを返したいと想像できますが、ここでは0外部キーとして特別な意味を付加しているようです。
于 2012-05-20T08:46:58.660 に答える