0

わかりましたテーブルがいくつかあります。関連するフィールドのみを表示しています:

items:
----------------------------------------------------------------
name    |   owner_id   |   location_id  | cab_id  | description |
----------------------------------------------------------------
itm_A   |    11        |     23         |  100    |   Blah      |
----------------------------------------------------------------
.
.
.

users:
-------------------------
 id       |    name      |
-------------------------
 11       |    John      |
-------------------------
.
.
.

locations
-------------------------
  id         |   name   |
-------------------------
  23         |  Seattle |
-------------------------
.
.
.

cabs
id      |    location_id   |   name
-----------------------------------
100     |       23         | Cool  |
-----------------------------------
101     |       24         | Cool  |
-----------------------------------
102     |       24         |thecab |
-----------------------------------

シアトルまたはデンバーからのすべてのアイテム (およびその所有者情報) を選択しようとしていますが、それらがシアトルにある場合は NAMED Cool という名前のタクシーにしか乗ることができず、デンバーにある場合は ' という名前のタクシーにしか乗ることができませんthecab' (デンバーではなくクール)。

このクエリは機能しませんが、私が達成しようとしていることを説明してくれることを願っています:

  SELECT DISTINCT
                `item`.`name`,
                `item`.`owner_id`,
                `item`.`description`,

                `user`.`name`, 

                IF(`loc`.`name` = 'Seattle' AND `cab`.`name` = 'Cool',1,0) AS `cab_test_1`,
                IF(`loc`.`name` = 'Denver' AND `cab`.`name` = 'thecab',1,0) AS `cab_test_2`,

        FROM `items` AS `item`
                LEFT JOIN `users` AS `user` ON `item`.`owner_id` = `user`.`id`
                LEFT JOIN `locations` AS `loc` ON `item`.`location_id` = `loc`.`location_id`
                LEFT JOIN `cabs` AS `cab` ON `item`.`cab_id` = `cabs`.`id`
        WHERE (`loc`.`name` IN ("Seattle","Denver")) AND `cab_test_1` = 1 AND `cab_test_2` = 1

私はむしろIFを取り除きたいです。場所\名前のペアがたくさんある場合、効率が悪く、見た目が悪く、拡張性がありません

4

2 に答える 2

0

私が最初に考えたのは、場所とタクシー名のペアを別のテーブルに格納することです。テーブルではありませんが、サブクエリによって生成された派生テーブルです。

テスト結果を別の列にピボットするという問題がまだ残っています。コードは mysql ブール式を使用することで簡素化できます。これにより、caseまたはが不要になりifます。

したがって、アプローチは、あなたが持っているのと同じ結合を使用することです(ただしleft join、比較によりcab.nameそれらが内部結合に変わるため、必要ありません)。次に、ペアの「テスト名」とともに、探しているペアのテーブルを追加します。最後のステップは明示的group byで、各テストの条件が満たされているかどうかを確認します。

SELECT i.`name`, i.`owner_id`, i.`description`, u.`name`,
       max(pairs.test_name = 'test_1') as cab_test_1,
       max(pairs.test_name = 'test_2') as cab_test_2
FROM `items` i LEFT JOIN
      `users` u
       ON i.`owner_id` = u.`id` LEFT JOIN
       `locations` l`
       ON i.`location_id` = l.`location_id` left join
       `cabs` c
       ON i.`cab_id` = c.`id` join
       (select 'test_1' as testname, 'Seattle' as loc, 'cool' as cabname union all
        select 'test_2', 'Denver', 'thecab'
       ) pairs
       on l.name = pairs.name and
          l.cabname = c.name
group by i.`name`, i.`owner_id`, i.`description`, u.`name`;

追加のペアを追加するには、それらを一緒に表に追加し、テスト フラグpairsの適切な行を追加します。select

于 2013-06-24T20:08:32.840 に答える