【问题标题】:SQL SELECT query returns duplicatesSQL SELECT 查询返回重复项
【发布时间】:2015-11-03 16:55:31
【问题描述】:

我正在尝试选择一些记录,但在下一个查询中我得到了 992 条记录而不是 124 条记录。任何人都可以帮助我吗?我得到了相同记录的重复,我不知道为什么。

SELECT uszc_posts.*, uszc_postmeta.*, uszc_users.*, uszc_utilizatori_acord.*
FROM uszc_posts, uszc_postmeta, uszc_users, uszc_utilizatori_acord
WHERE uszc_posts.ID = uszc_postmeta.post_id
AND uszc_users.ID = uszc_posts.post_author
AND uszc_users.user_email = uszc_utilizatori_acord.email
AND uszc_posts.ID IN (783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1150, 1151, 1152, 1153, 1154, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363)
ORDER BY `uszc_posts`.`post_date`  ASC

我也尝试过使用 SELECT DISTINCT(post_author),但我只得到 25 个结果而不是 124 个。

【问题讨论】:

  • 你试过了吗SELECT DISTINCT uszc_posts.*, ...
  • @JuanCarlosOropeza,是的,我做到了。用你刚才所说的话更新了我的问题。我确定查询应该返回 124 条记录
  • 您应该提供示例数据和架构,您可以使用sqlfiddle.com 没有数据,我们无法猜测您为什么没有您想要的行。
  • 您需要向我们提供样本数据、您获得的输出以及您期望获得的输出。没有这些,我们只能猜测可能出了什么问题。
  • 我从那些表中获取了所有列,只有它们被多次显示。它应该是 124 行而不是 992 行。

标签: php mysql sql wordpress


【解决方案1】:

您并没有真正得到重复,由于您加入postmeta 表的方式,您得到的行非常相似。例如,假设您有一个 ID 为 1 的帖子,并且它具有三个 postmeta 值,123,如果您运行以下查询,您将返回 3 行。

SELECT p.ID, pm.meta_value FROM posts p, postmeta pm WHERE p.ID = pm.post_id

结果:

p.ID  pm.meta_value
===================
1     1
1     2
1     3

根据您想要的结果,这个问题有不同的解决方案。如果您只想为您的posts 汇总数据,您可以GROUP BY p.ID 为每个帖子返回一行,但是您将无法解析您的postmeta 值,并且无法保证返回哪一个.您可以指定 postmeta 值以进一步减少重复项,但是此表中的特定键可能仍然存在重复条目,因此如果您只希望每个帖子有一行,您仍然需要 GROUP BY

我会这样写你的查询

-- using COUNT(p.Id) will show you how many results were GROUP(ed) BY the p.ID
SELECT COUNT(p.Id) num_results, p.*, pm.meta_key, pm.meta_value, u.*, ua.*
FROM uszc_posts p
LEFT JOIN uszc_postmeta pm
    ON pm.post_id = p.ID AND pm.meta_key = '?????' -- the key you are interested in
LEFT JOIN uszc_users u
    ON u.ID = p.post_author
LEFT JOIN uszc_utilizatori_acord ua
    ON ua.email = u.user_email
WHERE p.ID IN (783, 784, 785....)
GROUP BY p.ID
ORDER BY p.post_date ASC

【讨论】: