如果一次调用返回重复数据,是否可以在一次调用中使用多个SQL调用?
比如说,这是我正在尝试做的一个非常简单的版本,我们希望得到一个用户信息和他们喜欢的乐队。如果我在一次通话中完成,我可以这样做:
SELECT userName, userAge, userGender, bandName FROM users NATURAL JOIN userBands NATURAL JOIN bands WHERE userID = 47
这将返回给我一个用户喜欢的所有乐队的列表,但每一个乐队都会返回用户名,年龄和性别。
我可以打两个电话......
SELECT userName, userAge, userGender FROM users WHERE userID = 47
SELECT bandName FROM userBands NATURAL JOIN bands WHERE userID = 47
其中第一个只返回基本信息一次,第二个只返回波段列表。这有什么最好的做法吗?还有另一种方法可以解决这个问题,我没有意识到这一点吗?如果(在我的真实案例中将是这样的话)不仅仅是两次分离数据,而是4或5?所以这是一个更多的调用,但它也是一次调用返回更多的无关数据。
我正在使用PHP PDO,如果这会对答案产生影响。
答案 0 :(得分:1)
还有另一个答案,即使用group_concat()
将这些频段合并为一个列:
SELECT u.userName, u.userAge, u.userGender, group_concat(b.bandName)
FROM users u NATURAL JOIN
userBands ub NATURAL JOIN
bands b
WHERE userID = 47
GROUP BY u.userName, u.userAge, u.userGender;
这为每个用户提供了一行带有列表的列。
顺便说一句,我会阻止你使用NATURAL JOIN
。然后,查询依赖于连接键的元数据 - 对表结构的细微更改可能会对大量查询产生很大影响。使用显式on
子句或using
子句。
答案 1 :(得分:0)
通过网络向远程用户发送数据时,这是有意义的。为什么浪费带宽一遍又一遍地发送相同的数据?为此,一个好的方法是将数据放在某种XML结构中。
<users>
<user>
<userdata1>...</userdata1>
<...>...</...>
<bands>
<band>...</band>
<band>...</band>
...
</bands>
</user>
</users>
不会发送重复数据。无论是从具有重复数据的单个结果集还是从两个结果集形成此结构,都由您和您的团队决定。两种情况一起玩,并根据您的具体情况决定最佳选择。