Самостоятельное присоединение к SQL-запросу - PullRequest
0 голосов
/ 31 марта 2011

Несколько дней назад я попросил решение 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

Что мне нужно сделать, это отобразить все регистры, которые соответствуют стране с городом и обслуживанием. Или закажите все регистры _aciudad по стране (и _aservicio As service), например:

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

@ Рави Гуммади Дайте мне решение, которое выглядит так:

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 можно дублировать)?

Большое спасибо, ребята!

Ответы [ 2 ]

1 голос
/ 31 марта 2011

Таким образом, вы получите более 1 строки с одинаковым значением meta_value.Вы хотите отбросить некоторые из этих строк, даже если они имеют разные значения для других полей?В 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.Возможно:

ROW_NUMBER () в MySQL

1 голос
/ 31 марта 2011

Если вам не нужны meta_id и post_id, вы можете просто удалить текст t1.post_id, и t1.meta_id, а затем изменить SELECT на SELECT DISTINCT.

Если вам действительно нужен post_id, вам нужно будет сказать нам, как решить, какую строку сохранить - либо meta_id = 276, либо meta_id = 279 - как отметил Ламак в своем комментарии выше.

Редактировать 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

Если ни один из этих методов не работает для вас, вам нужно дать нам некоторые дополнительные критерии, чтобы мы знали, как усовершенствовать решение для вас.

...