Ошибка при выборе данных из трех таблиц mysql - PullRequest
0 голосов
/ 21 января 2012

Я был на этом запросе MySQL в течение 2 дней подряд. Это сценарий:

У меня есть две таблицы: пользователи и учетные записи. Там структуры ниже:

$sql="create table if not exists users (
    id bigint(20) not null auto_increment,
    username varchar(255) not null,
    password varchar(255) not null,
    email varchar(255),
    phone varchar(40),
    PRIMARY KEY (id, username))";

$sql="create table if not exists accounts (
    id int not null auto_increment, primary key(id),
    userid int(11) not null,
    type varchar(20) not null, <----- we have two types: bill and pay ------>
    amount varchar(255) not null,
    date_paid datetime not null)";

Что я хочу сделать:

Я хочу выбрать номера телефонов людей, которым более 10 000, и которые были оплачены или выставлены счета за последние 14 дней или более.

Как мы находим людей, которые должны:

Когда вам выставлен счет (при условии 50 000), в БД добавляется строка, например:

insert into accounts (id, userid, type, amount, date_paid) values ('', 'id of the person', 'OWE', 50000, '$date');

Когда человек платит (предположим, 20 000), также вставляется строка:

insert into accounts (id, userid, type, amount, date_paid) values ('', 'id of the person', 'PAY', 20000, '$date');

Чтобы получить сумму, причитающуюся человеку:

ВСЕ СЧЕТА - ВСЕ ОПЛАТЫ

Что я придумал:

select phone  from users u, accounts a1, accounts a2 where u.id=a1.userid and phone != '' and (((select sum(a1.amount) from a1 where a1.userid=u.id and a1.type='owe') - (select sum(a2.amount) from a2 where a2.userid=u.id and a2.type='pay')) >= 10000) and datediff(NOW(), select max (a1.datetime) as datetime from a1 where a1.userid=u.id) > 14 group by u.id

Я уже давно модифицирую этот запрос, и лучшее, что я получаю, - это ошибки. Некоторые из которых:

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса, чтобы использовать около select max (a1.datetime) as datetime from a1 where a1.userid=u.id) > 14 group by

Когда я удаляю последнее и предложение, оно показывает: таблица db.a2 не существует.

Пожалуйста, как мне это сделать?

1 Ответ

1 голос
/ 21 января 2012

Подсказки:

  • было бы лучше, если сумма была бы десятичной или чем-то вроде
  • хранить платежи с отрицательной суммой, и вы можете просто сложить сумму, чтобы получить баланс

получить баланс

SELECT u.id, SUM(CASE WHEN type = 'OWE' 
                 THEN CAST(amount AS DECIMAL(10,2)) 
                 ELSE CAST(amount AS DECIMAL(10,2))*-1 END ) as balance
FROM users u
INNER JOIN accounts a ON u.id = a.userid
GROUP BY u.id 
HAVING balance > 10000

проверить, чтобы телефонный номер имел как минимум 5 символов

WHERE CHAR_LENGTH(phone) > 4  

Все вместе + Дата

SELECT u.phone, u.id, SUM(CASE WHEN type = 'OWE' 
                 THEN CAST(amount AS DECIMAL(10,2)) 
                 ELSE CAST(amount AS DECIMAL(10,2))*-1 END ) as balance,
             MAX (date_paid) as last_action
FROM users u
INNER JOIN accounts a ON u.id = a.userid
WHERE CHAR_LENGTH(phone) > 4 
GROUP BY u.id 
HAVING balance > 10000 OR DATE_SUB(CURDATE(),INTERVAL 14 DAY) <= last_action
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...