0
SELECT
    MAX(`client_id`) `client_id`
FROM
    `phrases`
WHERE
    `language_id` = 1 AND
    `client_id` = 1 OR
    `client_id` IS NULL
GROUP BY
    `language_phrase_id`

id値を保持する行を取得するにはどうすればよいMAX(`client_id`)ですか?

派生テーブルのコンテキストでこれが必要です。

SELECT
    `p2`.`phrase`
FROM
    (SELECT `language_phrase_id`, MAX(`client_id`) `client_id` FROM `phrases` WHERE `language_id` = 1 AND `client_id` = 1 OR `client_id` IS NULL GROUP BY `language_phrase_id`) `p1`
INNER JOIN
    `phrases` `p2`
ON
    `p2`.`language_id` = 1 AND
    `p1`.`language_phrase_id` = `p2`.`language_phrase_id` AND
    `p1`.`client_id` = `p2`.`client_id`;
4

2 に答える 2

0

ウィンドウ関数を使用して各グループの最大値を見つけ、次にwhere句を使用して最大値の行を選択します。

select p.*
from (SELECT p.*, max(client_id) partition by (language_phrase_id) as maxci
      from phrases p
      WHERE (`language_id` = 1 AND `client_id`= 1) or
            `client_id` IS NULL
     ) p
where client_id = maxci

whereまた、ステートメントを明確にするために括弧を追加しました。andとを混合するときorは、混乱や間違いを避けるために、常に括弧を使用します。

ステートメントにタグを追加したmysqlので、これは機能しません。したがって、MySQL固有のソリューションは次のとおりです。

select language_phrase_id,
       substring_index(group_concat(id order by client_id desc), ',', 1) as max_id
from phrases
group by phrases p

idこのプロセスで文字列に変換される場合は、このことに注意してください。タイプが異なる場合は、元に戻すことができます。

于 2013-03-07T19:30:52.527 に答える
0

要件を理解するのに少し苦労しましたが、これあなたが探しているもののようです.
最も美しいSQLではなく、単純化できると確信していますが、出発点です。

SELECT p1.id, p1.phrase
FROM phrases p1
LEFT JOIN `phrases` p2
  ON p1.language_id=p2.language_id
 AND p1.language_phrase_id=p2.language_phrase_id
 AND p1.client_id IS NULL and p2.client_id = 1
WHERE p2.id IS NULL AND p1.language_id=1 
  AND (p1.client_id=1 or p1.client_id IS NULL)
GROUP BY p1.language_phrase_id

テスト用の SQLfiddle

于 2013-03-07T19:24:36.233 に答える