-5

2 種類のメッセージがあります。1 つはプライベート メッセージで、もう 1 つはクレジット メッセージで、2 つの異なるテーブルに挿入されます。今、私はデータを取得しようとしています。

SELECT * ,(SELECT COUNT(*) 
           FROM votes 
           WHERE message_id = m.message_id
             AND vote_type = 'like') AS likes,
          (SELECT COUNT(*) 
           FROM votes
           WHERE message_id = m.message_id 
           AND vote_type = 'dislike') AS dislikes 
FROM messages m
WHERE 1 #and hidden is null
  and recipient_id = 1
ORDER BY datetime DESC

SELECT * ,(SELECT COUNT(*) 
           FROM votes 
           WHERE message_id = m.message_id
             AND vote_type = 'like') AS likes,
          (SELECT COUNT(*)
           FROM votes
           WHERE message_id = m.message_id  
             AND vote_type = 'dislike') AS dislikes 
FROM private_messages m 
WHERE 1 #and hidden is null 
  and recipient_id = 1 
ORDER BY datetime DESC

これらを 1 つのクエリにマージして、1 つの追加パラメーターでプライベート メッセージまたはクレジット メッセージを表示します。

4

3 に答える 3

2

既存のクエリが必要/必要なことをUNION行う場合、それらを組み合わせるのが非常に簡単になります。

SELECT * FROM (
    SELECT is_private 0, <field1>,<field2>,<field3>, ... ,(SELECT COUNT(*) 
               FROM votes 
               WHERE message_id = m.message_id
                 AND vote_type = 'like') AS likes,
              (SELECT COUNT(*) 
               FROM votes
               WHERE message_id = m.message_id 
               AND vote_type = 'dislike') AS dislikes 
    FROM messages m
    WHERE 1 #and hidden is null
      and recipient_id = 1
    UNION ALL
    SELECT 1, <field1>, <field2>, <field3>, ... ,(SELECT COUNT(*) 
               FROM votes 
               WHERE message_id = m.message_id
                 AND vote_type = 'like') AS likes,
              (SELECT COUNT(*)
               FROM votes
               WHERE message_id = m.message_id  
                 AND vote_type = 'dislike') AS dislikes 
    FROM private_messages m 
    WHERE 1 #and hidden is null 
      and recipient_id = 1 
)
ORDER BY datetime DESC

ユニオンが機能するには、両方のクエリから同じ数/順序の列を選択する必要があることに注意してください。SELECT *そうであるかどうかを確認するのが難しくなります。もしも

于 2013-07-28T12:26:44.327 に答える
0

I think the following is a much simpler way to express the logic:

select m.*, v.likes, v.dislikes
from (select v.message_id, sum(vote_type = 'like') AS likes, sum(vote_type = 'dislike') AS dislikes
      from votes v
      group by v.message_id
     ) v join
     (select m.*, 'Message' as which
      from messages
      union all
      select pm.*, 'PrivateMessage' as which
      from private_messages pm
     ) m
     on v.message_id = m.message_id;
于 2013-07-28T13:29:45.583 に答える
0

UNION を使用して mysql クエリを組み合わせることができます。

SELECT id FROM table_user UNION SELECT COUNT(vote) FROM table_vote

UNION による複数の UNION クエリを使用できます。

お気に入り、

クエリ 1

連合

クエリ 2

連合

……………………

クエリ n

于 2013-07-28T12:38:29.120 に答える