-2

我有我的以下 PHP 代码,它可以找到分配给它们的服务器和标签。在我的例子中,它的弯曲,经济。该脚本获得了一个同时拥有这两者但显示两次的服务器。阻止这种情况的最佳方法是什么?

请注意,标签存储在单独的表中,并通过服务器 ID 搜索获得。

PHP代码:

$query = "SELECT s.id, s.name, s.ip, s.port, ss.id, ss.votes, ss.added, (1.6 * ss.votes + .053) * GREATEST(1, DATEDIFF(NOW(), ss.added)) AS score, GREATEST(1, DATEDIFF(NOW(), ss.added)) AS days, st.server_id, st.server_tags
FROM $tbl_name AS s
LEFT JOIN server_score AS ss
ON s.id = ss.id
LEFT JOIN server_tags AS st
ON s.id = st.server_id
WHERE st.server_tags IN ($sstag)";

结果 在此处输入图像描述

完整脚本http://pastebin.com/5WHApEsd

4

2 回答 2

2

我不完全确定这是否是您要问的,因为问题和查询似乎截然不同……但是请尝试:

SELECT DISTINCT (s.id), xxx, xxx, xxx, etc
于 2013-08-23T16:16:43.130 回答
0

加入一个子查询,将所有具有相同服务器 ID 的行组合起来:

SELECT ...
...
LEFT JOIN (SELECT server_id, GROUP_CONCAT(server_tags) server_tags
           FROM server_tags
           WHERE server_tags IN ($sstag)
           GROUP BY server_id) AS st
ON s.id = st.server_id

或者,您可以使用原始查询,但将GROUP_CONCAT(server_tags) in the mainSELECT clause andGROUP BY s.id` 放在最后。

如果您想要匹配所有标签的服务器,而不仅仅是其中任何一个,您可以更改为:

LEFT JOIN (SELECT server_id, GROUP_CONCAT(server_tags) server_tags, COUNT(*) tag_count
           FROM server_tags
           WHERE server_tags IN ($sstag)
           GROUP BY server_id
           HAVING tag_count = $sstag_count) AS st

您需要设置$sstag_count$sstag.

于 2013-08-23T16:39:43.630 回答