选择使用三个表,带有1000多个条目

时间:2017-09-09 22:27:39

标签: mysql select join

对于交易清单,我需要提供以下列:

  • log_out.timestamp
  • items.description
  • log_out.qty
  • category.name
  • storage.name
  • log_out.dnr(代表用户ID)

log_out的表格结构如下所示:

| id | timestamp | storageid | itemid | qty | categoryid | dnr |
|    |           |           |        |     |            |     |
| 1  | ........  |     2     |   23   |  3  |     999    | 123 |

可以猜测,我只存储此表中其他表的相应ID。注意:log_out.id是此表中的主键。

为了得到相应的字符串,int或者其他什么,我尝试了两个查询。

方法1

SELECT i.description, c.name, s.name as sname, l.*
FROM items i, categories c, storages s, log_out l
WHERE l.itemid = i.id AND l.storageid = s.id AND l.categoryid = c.id
ORDER BY l.id DESC

方法2

SELECT log_out.id, items.description, storages.name, categories.name AS cat, timestamp, dnr, qty
FROM log_out
INNER JOIN items ON log_out.itemid = items.id
INNER JOIN storages ON log_out.storageid = storages.id
INNER JOIN categories ON log_out.categoryid = categories.id
ORDER BY log_out.id DESC

它们在我的开发机器上运行良好,该机器在log_out中存储了大约99个虚拟事务。主服务器上的DB有类似1100+ tx存储在表中。这就是麻烦开始的地方。无论我在主机上运行这两种方法中的哪一种,它总是返回0行,没有任何错误* 叹息*

首先我想,这是因为主机使用MariaDB而不是MySQL。但是在我将远程log_out表导入我的开发机器后,它与主机一样 - >返回0行没有错误。

你们知道发生了什么事吗?

2 个答案:

答案 0 :(得分:2)

如果表中有数据,那么它可能与JOIN和相应表中的相关记录有关。我将从log_out表开始,并逐步添加JOIN中的其他表,例如:

SELECT * 
FROM log_out;

SELECT *
FROM log_out
INNER JOIN items ON log_out.itemid = items.id;

SELECT *
FROM log_out
INNER JOIN items ON log_out.itemid = items.id
INNER JOIN storages ON log_out.storageid = storages.id;

SELECT *
FROM log_out
INNER JOIN items ON log_out.itemid = items.id
INNER JOIN storages ON log_out.storageid = storages.id
INNER JOIN categories ON log_out.categoryid = categories.id;

我会逐个执行所有查询,看看哪一个会产生0条记录。该查询中的其他连接将是具有数据差异的连接。

答案 1 :(得分:0)

你的查询对我来说很好,这让我觉得这可能是数据出乎意料的事情。很可能连接中的ID没有正确维护(所有这些都有外键约束吗?)。我会挖掘数据,比如SELECT COUNT(*) FROM items WHERE id IN (SELECT itemid FROM log_out)等,看看回报是否有意义。对不起,我无法提供更多建议,但如果问题出在数据本身,我会有兴趣听听。