我有超过50个不相关的表,但它们都有一个“名称”字段,我想查询“John”并在不同的表中获取所有Johns并将每一行存储在一个数组(Javascript)中例如:
arr['table1']="results if any"
arr["table2"]="results if any".
我现在正在做的是每个表的for循环:
SELECT * from tablesNameArray[i] WHERE name="John",
但我真的很想知道是否还有其他更好或更“正确”的做法。
谢谢
答案 0 :(得分:2)
您可以使用UNION
:
SELECT * FROM table1 WHERE name = 'John'
UNION ALL
SELECT * FROM table2 WHERE name = 'John'
UNION ALL
SELECT * FROM table3 WHERE name = 'John'
...
您可以从数组动态构造查询:
sql = tablesNameArray.map(table => `SELECT * FROM ${table} WHERE name = 'John'`).join(" SELECT ALL ");
答案 1 :(得分:0)
您可以使用联接。在这种情况下,请参阅the join docs,MySQL。
这样的事情应该这样做:
SELECT table1.*, table2.*, table3.*
FROM table1
LEFT JOIN table2 ON table1.name = table2.name
LEFT JOIN table3 ON table1.name = table3.name
WHERE table1.name = "John";
即使联接的表格没有匹配的行,左连接仍会从第一个表格中进行选择 - 您将在第二个表格的所选列中获得NULL
对于那些没有匹配的行。
但是,根据您的要求,这可能并不好 - 我相信它不会从table2或table3中获取行,而table1中的该用户没有相应的行。
正如@ spencer7593在下面的评论中指出的那样,如果您确定name
列在每个表中都是唯一的,那么您应该只执行此操作,否则您可能会生成一些非常庞大的结果集