левое соединение или правое соединение в запросе MySQL? - PullRequest
1 голос
/ 21 мая 2011
table1: node
fields: nid, ,title,type,created

query1:

mysql_query(SELECT nid,title, type,created FROM `node` where type="provider"  ORDER BY created DESC LIMIT 0 , 22)



table2:  votingapi_vote
fields:   content_id, value=1 or  value=0, value_type=option

query2:

SELECT content_id,
       SUM(CASE WHEN value=1 THEN 1 
                WHEN value=0 THEN -1 
                ELSE 0 
           END) AS ContentSum
    FROM votingapi_vote
    WHERE value_type = 'option'
    GROUP BY content_id
    ORDER BY ContentSum DESC

content_id значение равно nid значение, но в таблице 1 nid может не иметьвзаимно-однозначное соответствие таблице 2. например:

table 1     table2
nid          content_id

1              1
2              3
3

, но content_id имеет взаимно-однозначное соответствие nid в таблице 1.

Теперь я хочу получить title list.Который является не-1019 *.descending order соответствует ContentSum и created.есть ли способ получить это?я должен использовать left join?я не знаю, как заставить два запроса превратиться в один?

сложный запрос, чтобы написать мне в mysql?

перефразировать его :

структура таблицы один {узел}:

nid        type             title                 created

10          provider        test one              1298107010
11          provider        test two              1298107555    
12          provider        example one            1300524695 
13          provider        example two            1298081391
14          provider        example three          1298082340
15          company         example four           1298083519
16....      company         example five          1298083559

структура таблицы два {Voteapi_vote}:

content_id      value    value_type

10                1          option
10                 0          option
11                 1          option
12                 0          option
15                 3          percent
15                 2          percent
16.....            0          option

я хочу:

получить22 списка заголовков

...
test one
test two
example one
example two 
...

1, значение nid равно значению content_id в таблице 2.

порядок очереди списка заголовков :

1, сначала в соответствии с таблицей 2 content_id по убыванию списка плиток (по убыванию content_id с использованием «Для каждого content_id - количество строк со значением = 1 минус количество строк со значением = 0»)

2, поскольку таблица2 может содержать менее 22 записей и имеет такое же значение, когда число строк со значением = 1 минус количество строк со значением = 0.когда возникнет это состояние.используя поле created в таблице 1 для спуска tile

Ответы [ 2 ]

5 голосов
/ 21 мая 2011
<table1> left join <table2>

Означает, что кортежи не обязательно должны иметь соответствующий элемент в таблице2, но все элементы в таблице1 будут включены.

<table1> right join <table2>

Означает, что кортежи не обязательно должны иметь соответствующий элемент в таблице1, но все элементы в таблице2 будут включены.

2 голосов
/ 21 мая 2011

Приведенный вами пример не совсем понятен для меня. Я просто дам запрос, который объединяет два запроса, которые вы предоставили.

Попробуйте это

SELECT nid,title, type,created, v_api.ContentSum
  FROM `node` n
  LEFT JOIN ( SELECT content_id,
                     SUM(CASE WHEN value=1 THEN 1 
                         WHEN value=0 THEN -1 
                         ELSE 0 
                     END) AS ContentSum
                FROM votingapi_vote
               WHERE value_type = 'option'
               GROUP BY content_id) v_api 
    ON n.nid = v_api.content_id
 where type="provider"
ORDER BY v_api.ContentSum DESC, created DESC LIMIT 0 , 22;

Примечание: вы можете удалить некоторые ненужные столбцы.

Другие вещи, которые нужно знать:

  • Использование LEFT JOIN также создаст строку, которая не имеет эквивалента nid to content_id. Вот почему я добавил v_api.ContentSum, чтобы вы увидели, что это создаст значение null.
  • Вы можете использовать COALESCE, если хотите добавить значение, если оно возвращает null. Вы можете использовать INNER JOIN Если вы не хотите включать строку с v_api.ContentSum, равным null.
  • О RIGHT JOIN Я не уверен, что это то, что вам нужно в отношении вашего вопроса, основываясь на моем понимании.

Также взгляните на это mysql / join .

Надеюсь, это поможет.

...