2014-05-22 3 views
0

J'ai une table utilisateur tenant des données de l'utilisateurIdentifier transaction Bitcoin problèmes MySQL Query

++ id | username | btc_recive_address++ 
---------------------------------------- 
++ 1 | myuser | 123kahpoiq31328 ++ 

table de commande

++ order_id | user_id | amount | order_timestamp 
------------------------------------------------------ 
++ h6765-a1s | 1  | 0.1 BTC | 2014-04-09 13:21:34 
------------------------------------------------------ 
++ kzg765-a1 | 1  | 0.1 BTC | 2014-04-09 17:11:23 

et table de collecteur qui récupère les données de Bitcoin API (ici j'identifie l'expéditeur avec btc_recive_address)

++ block_chain  | user | amount | timestamp 
-------------------------------------------------------------------------------- 
++ 2d37e5351196... | 1 | 0.1 | 2014-04-09 16:21:34 
-------------------------------------------------------------------------------- 
++ 123kjhg7231k.. | 1 | 0.1 | 2014-04-08 19:33:56 
-------------------------------------------------------------------------------- 

et j'essaie d'affecter une transaction à order_id comme générer une jointure vue ed de l'ordre et de la table collecteur mais j'ai des problèmes lorsque la quantité et l'utilisateur est le même

LE PROBLÈME

utilisateur place commande multiple avec la même valeur

0,1 X 3

I récupérer les données de transaction de l'API que d'identifier l'utilisateur avec l'adresse de remise.

que j'essaie de construire une vue MySQL comme comparaison

commander la table avec la table de collection comme la jonction sur l'utilisateur et la quantité. Lorsque la quantité et l'utilisateur est la même que je ne reçois pas le transaction_id unique à partir order_table à mon avis

Voici la requête de vue

ALTER ALGORITHM=UNDEFINED DEFINER=`my_view`@`%` SQL SECURITY DEFINER VIEW `ci_orders_in` AS (
SELECT 
    `c`.`block_chain`  AS `block_chain`, 
    `c`.`assigned_user`  AS `assigned_user`, 
    `c`.`incoming_amount` AS `incoming_amount`, 
    `c`.`timestamp`   AS `timestamp`, 
    `c`.`type`    AS `type`, 
    `c`.`category`   AS `category`, 
    `c`.`import_timestamp` AS `import_timestamp`, 
    `o`.`transaction_id` AS `transaction_id`, 
    `o`.`datum`    AS `datum`, 
    `o`.`status`   AS `status`, 
    `o`.`convert_coin`  AS `convert_coin`, 
    `o`.`convert_coin_to` AS `convert_coin_to`, 
    `o`.`amount`   AS `amount`, 
    `o`.`converted_amount` AS `converted_amount`, 
    `o`.`conversion_rate` AS `conversion_rate`, 
    `o`.`user`    AS `user`, 
    `o`.`units_to_transfer` AS `units_to_transfer`, 
    `o`.`provision`   AS `provision` 
FROM (`ci_orders` `o` 
    JOIN `ci_collector` `c` 
    ON ((`o`.`user` = `c`.`assigned_user`))) 
WHERE (`o`.`convert_coin` = `c`.`type`) 
GROUP BY `o`.`converted_amount`)$$ 

DELIMITER ; 

ici, je devrais utiliser une autre jointure qui devrait me donner l'horodatage le plus proche, mais Je ne vais pas de l'avant

+0

À quel problème êtes-vous confronté pourriez-vous le spécifier? –

+0

le problème est quand j'ai par exemple plusieurs transaction de 0,1BTC du même utilisateur l'ID de transaction ne sera pas comme il devrait être affecté. J'ai en vue des transactions avec transaction_id similaire sur ce qui ne devrait pas se produire – fefe

+0

toujours pas clair serait-il possible pour vous d'ajouter quelques exemples de données et la sortie désirée que vous regardez? –

Répondre

0

Eh bien, juste en regardant votre vue, il est évident que vous ne nous montrez pas toutes les colonnes dans ces tableaux, et vous avez truqué les noms de table parce que la requête a la colonne "utilisateur" dans la table ci_order, mais dans les données de l'échantillon est la colonne "user_id". Mais depuis que je lis votre question sur le Bitcoin site de SE, et je suis vaguement au courant de ce que vous essayez de faire, je devine que vous allez avoir une requête similaire à ce

[requête incorrecte]

Editer: Désolé de ne pas regarder de plus près les horodatages. En fait, j'ai pris la peine de charger votre jeu de données dans SQL (MS SQL 2014) cette fois, même si j'ai peut-être légèrement renommé les colonnes. Que dis-tu de ça? Aussi, si vous pouviez fournir des détails sur le délai, cela serait utile, par exemple si l'horodatage de la commande venait toujours après l'horodatage du collecteur?

select * 
from ci_orders 
join ci_collector 
    on ci_orders.user_id = ci_collector.user_id 
    and ci_orders.amount = ci_collector.amount 
    and ci_collector.timestamp = (
     select top 1 timestamp 
     from ci_collector 
     where ci_orders.user_id = ci_collector.user_id 
     and ci_orders.amount = ci_collector.amount 
     and ci_orders.timestamp > ci_collector.timestamp 
     order by timestamp desc 
    ) 
+0

Cette jointure ne fonctionnerait pas car il existe un délai entre deux horodatages – fefe

+0

Veuillez vous reporter à la modification. – Matt

+0

êtes-vous sûr que cette requête fonctionne sur mysql ?! – fefe