मेरे पास एक लेनदेन तालिका है, प्रत्येक लेनदेन में एक पता फ़ील्ड होता है जो एक पता तालिका में एक पंक्ति का संदर्भ देता है, पता तालिका में प्रत्येक पते में एक सिक्का होता है।

मैं एक विशिष्ट उपयोगकर्ता के लिए प्रत्येक सिक्के के लिए सभी लेनदेन का योग प्राप्त करना चाहता हूं।

मेरे पास समस्या यह है कि यदि किसी उपयोगकर्ता के पास 0 लेनदेन या पते हैं जो किसी विशिष्ट सिक्के से संबंधित हैं तो यह परिणाम से पूरी तरह गायब है। मुझे एक सिक्का तालिका में सभी सिक्कों की आवश्यकता है जिसमें 0 लेन-देन या पते हैं जो 0 की राशि के साथ वापस आते हैं।

SELECT coins.name, SUM(transactions.amount),coins.price_usd
            FROM coins
            LEFT JOIN addresses ON addresses.coin_id = coins.id
            LEFT JOIN transactions ON transactions.address = addresses.address
            LEFT JOIN users ON transactions.user_id = users.id
            WHERE users.email = 'testemail@email.com'
            GROUP BY coins.name, coins.price_usd
2
LoganHenderson 9 जून 2018, 21:48

1 उत्तर

सबसे बढ़िया उत्तर

यह समाधान आपको दिखाता है कि आप क्या चाहते हैं:

create table coins (
  id int,
  name varchar(10),
  price_usd int
);

insert into coins (id, name, price_usd) values (1, 'Pound', 2);
insert into coins (id, name, price_usd) values (2, 'Yen', 98);
insert into coins (id, name, price_usd) values (3, 'Euro', 3);

create table addresses (
  coin_id int,
  address int
);

insert into addresses (coin_id, address) values (1, 20);
insert into addresses (coin_id, address) values (3, 30);

create table transactions (
  address int,
  user_id int,
  amount int
);

insert into transactions (address, user_id, amount) values (20, 500, 123);
insert into transactions (address, user_id, amount) values (20, 500, 101);
insert into transactions (address, user_id, amount) values (30, 501, 456);

create table users (
  id int,
  email varchar(50)
);

insert into users (id, email) values (500, 'testemail@email.com');
insert into users (id, email) values (501, 'another@email.com');

select coins.name, sum(transactions.amount),coins.price_usd
  from coins
  join addresses on addresses.coin_id = coins.id
  join transactions on transactions.address = addresses.address
  join users on transactions.user_id = users.id
  where users.email = 'testemail@email.com'
  group by coins.name, coins.price_usd
union all
select name, 0, 0
  from coins
  where id not in (
    select coin_id 
      from addresses
      join transactions on transactions.address = addresses.address
      join users on transactions.user_id = users.id
      where users.email = 'testemail@email.com'
  );

नतीजा:

name   sum  price_usd
-----  ---  ---------
Pound  224          2  -- the requested user
Yen      0          0  -- another user
Euro     0          0  -- coin with no transactions
4
The Impaler 14 जून 2018, 00:17