0

几天前,我要求解决我需要解决的 SQL 查询,我的数据如下所示:

meta_id post_id     meta_key    meta_value
269     4   _apais               USA
270     4   _aciudad             New york
271     4   _aservicio           Pleasure

...
272     43  _apais               USA
273     43  _aciudad             Chicago
274     43  _aservicio           Fun
...
275     44  _apais               USA
276     44  _aciudad             Miami
277     44  _aservicio           Night Life

278     45  _apais               USA
279     45  _aciudad             Miami
280     45  _aservicio           Sports

我需要做的是显示与 Country 与 City 和 Service 匹配的所有寄存器。或者按国家(和 _aservicio 作为服务)订购所有 _aciudad 寄存器,例如:

meta_id     post_id     meta_key    meta_value  meta_key    meta_value  meta_key  meta_value
270         7           _apais          USA     _aciudad    New York   _aservicio Pleasure
261         13          _apais          USA     _aciudad    Chicago    _aservicio Fun
276         4           _apais          USA     _aciudad    Miami      _aservicio Sports

@Ravi Gummadi 给了我一个看起来像这样的解决方案:

SELECT t1.meta_id, 
           t1.post_id, 
           t1.meta_key, 
           t1.meta_value, 
           t2.meta_key, 
           t2.meta_value 
    FROM th_postmeta t1, th_postmeta t2  
    WHERE t1.post_id = t2.post_id 
    AND t1.meta_key = '_apais'
    AND t2.meta_key = '_aciudad'
    ORDER BY t1.meta_key

该查询返回:

meta_id     post_id     meta_key    meta_value  meta_key    meta_value
270         7           _apais          USA     _aciudad    New York
261         13          _apais          USA     _aciudad    Chicago
276         4           _apais          USA     _aciudad    Miami
279         10          _apais          USA     _aciudad    Miami

我怎样才能只显示在 meta_value 值中不重复的记录(仅对于 _aciudad 和 _aservicio,_apais 可以重复)?

非常感谢你们!

4

2 回答 2

1

如果您不需要 meta_id 和 post_id,您可以删除文本t1.post_id,t1.meta_id,然后更改SELECTSELECT DISTINCT.

如果您确实需要 post_id,您需要告诉我们如何决定保留哪一行 - meta_id=276 或 meta_id=279 - 正如 Lamak 在上面的评论中指出的那样。

编辑1:

如果你想在查询中保留 meta_id 和 post_id,但你不关心 meta_id 和 post_id 中的哪些值被保留,那么你可以这样做:

SELECT
    MAX(t1.meta_id), 
    MAX(t1.post_id), 
    t1.meta_key, 
    t1.meta_value, 
    t2.meta_key, 
    t2.meta_value 
FROM th_postmeta t1, th_postmeta t2  
WHERE t1.post_id = t2.post_id 
AND t1.meta_key = '_apais'
AND t2.meta_key = '_aciudad'
GROUP BY t1.meta_key, t1.meta_value, t2.meta_key, t2.meta_value
ORDER BY t1.meta_key

请注意,您可能会使用此方法从“混合”在一起的不同记录中获得 meta_ids 和 post_ids,因为不能保证具有最高 meta_id 的记录也将具有最高 post_id,反之亦然。

如果你不需要 meta_id 或 post_id 而只需要 meta_keys 和 meta_values,你可以这样做:

SELECT DISTINCT
    t1.meta_key, 
    t1.meta_value, 
    t2.meta_key, 
    t2.meta_value 
FROM th_postmeta t1, th_postmeta t2  
WHERE t1.post_id = t2.post_id 
AND t1.meta_key = '_apais'
AND t2.meta_key = '_aciudad'
ORDER BY t1.meta_key

如果这些方法都不适合您,那么您需要给我们一些额外的标准,以便我们知道如何为您优化解决方案。

于 2011-03-31T17:21:15.897 回答
1

因此,您最终会得到超过 1 行具有相同元值的行。您想丢弃其中一些行,即使它们对其他字段具有不同的值?在 SQL Server 中,您可能会执行以下操作:

SELECT
    ..., x = ROW_NUMBER() OVER(PARTITION BY meta_value ORDER BY meta_id )
WHERE
   x <= 1

这引入了另一个计算列 (x),每行 (order by) 在每个 meta_value (partition by) 上重新启动的数量增加。该order by子句定义了哪些是最重要的保留/丢弃,以及where每个保留的数量。

meta_id     post_id     meta_key    meta_value  meta_key    meta_value   x
261         13          _apais          USA     _aciudad    Chicago      1
270         7           _apais          USA     _aciudad    New York     2
276         4           _apais          USA     _aciudad    Miami        3
279         10          _apais          USA     _aciudad    Miami        4
280         10          _apais          ABC     _aciudad    Miami        1
281         10          _apais          ABC     _aciudad    Miami        2

我意识到您将其标记为 MySql。我并没有真正使用 MySQL,希望这只是为您提供有关 Google 新事物的线索。也许:

MySQL 中的 ROW_NUMBER()

于 2011-03-31T17:22:18.120 回答