0

脳が悪い。何かがクリックされていないのは、おそらく単純だと私は知っています。サブクエリを回避するために最善を尽くしていますが、避けられない場合があります。

左側のテーブル[]にはcards_types11個のレコードがあり、右側のテーブル[ users_cards]には1〜11個のレコードがあります。左側のテーブルと右側のテーブルにあるすべてのレコードを返す必要があります。右側のテーブルの唯一の注意点は、IF / ELSEステートメントを実行して、0の値を返すことcard_typesです。idに見つかりませんusers_cards。また、には外部キー制約がありcards_typesます。id=> users_cardstype_id(重要な場合)。

クエリ

SELECT
  t.id,
  t.slug,
  t.label AS type_label,
  t.points AS point_value,
  IF (c.mtg_id IS NULL, 0, c.mtg_id) AS mtg_id,
  IF (c.label IS NULL, 0, c.label ) AS card_label,
  IF (uc.points IS NULL, 0, uc.points ) AS card_score
FROM cards_types t
JOIN users_cards uc
  ON uc.type_id = t.id
JOIN cards c
  ON c.id = uc.card_id
WHERE uc.user_id = 1
  AND uc.season_id = 1
ORDER BY t.priority ASC
4

2 に答える 2

3

現在使用しているINNER JOINので、に変更してLEFT JOINください。また、WHERE句フィルターをに移動したJOINので、からすべての行が返されcards_typeます。句にフィルターを残すと、 :WHEREのように機能します。INNER JOIN

SELECT
  t.id,
  t.slug,
  t.label AS type_label,
  t.points AS point_value,
  COALESCE(c.mtg_id, 0) AS mtg_id,
  COALESCE(c.label, 0) AS card_label,
  COALESCE(uc.points, 0) AS card_score
FROM cards_types t
LEFT JOIN users_cards uc
  ON uc.type_id = t.id
  AND uc.user_id = 1  -- < -- move the where filters here
  AND uc.season_id = 1
LEFT JOIN cards c
  ON c.id = uc.card_id
ORDER BY t.priority ASC
于 2013-01-16T23:37:46.080 に答える
0

そのように左結合で試してみてください

 SELECT
  t.id,
  t.slug,
  t.label AS type_label,
  t.points AS point_value,
  COALESCE(c.mtg_id, 0) AS mtg_id,
  COALESCE(c.label, 0) AS card_label,
  COALESCE(uc.points, 0) AS card_score
FROM cards_types t
LEFT JOIN users_cards uc
  ON uc.type_id = t.id
  AND uc.user_id = 1
  AND uc.season_id = 1
LEFT JOIN cards c
  ON c.id = uc.card_id
ORDER BY t.priority ASC
于 2013-01-16T23:38:52.533 に答える