MySQL Как использовать Main Select Value в качестве аргумента подзапроса? - PullRequest
3 голосов
/ 23 сентября 2011

Я пытаюсь создать запрос, который немного сложнее, чем все, что я делал в моем ограниченном опыте работы с базами данных.

TABLE:

id - data - type - data3
1 - hello - 1 - 1
2 - goodbye - 1 - 1
3 - goodbye - 1 - 2
4 - goodbye - 2 - 1
5 - hello - 2 - 1

Цель состоит в том, чтобы сделать 4 вещи:

  1. Сгруппировать результаты по «данным», но вернуть только один результат / строку каждого тип данных.
  2. СЧИТАЙТЕ общее количество каждой "ГРУППЫ данных" и возвращайте это число.
  3. Сделайте это для обоих "type" = 1 и "type" = 2, хотя мне нужен только каждый Элемент "data" GROUP один раз.
  4. возможность сортировки результатов по каждому элементу SELECT.

Таким образом, возвращаемый конечный результат должен быть (извините, что запутал!):

data, COUNT(data["type"]=1), COUNT(data["type"]=2 AND data["data"] = data)

Итак, для приведенной выше таблицы образцов желаемые результаты будут:

loop 1 - hello, 2, 1
loop 2 - goodbye, 3, 1

Тогда, в идеале, я мог бы отсортировать результаты по любому из них.

Это запрос, который я пытался построить, прежде чем прибегнуть к публикации, я не думаю, что это даже близко к правильности, но это может помочь проиллюстрировать то, чего я пытаюсь достичь немного лучше:

SELECT 
  (
   SELECT `clicks_network_subid_data`, COUNT(*) 
   FROM track_clicks 
   WHERE `clicks_campaign_id`='$id' AND `clicks_click_type` = '1'
  ) AS keywords, 
  (
   SELECT COUNT(*) 
   FROM track_clicks 
   WHERE `clicks_campaign_id`='$id' AND `clicks_click_type` = '2' AND `clicks_network_subid_data` = keywords.clicks_network_subid_data 
  ) AS offer_clicks 
 GROUP BY keywords.clicks_network_subid_data 
 ORDER BY keywords.COUNT(*) DESC

Мне также нужно выполнить JOIN для другой таблицы, чтобы получить еще один фрагмент данных, но я думаю, что справлюсь с этим, как только выясню эту часть.

Ответы [ 3 ]

1 голос
/ 23 сентября 2011

Вы можете использовать IF-функцию для этого

SELECT `clicks_network_subid_data`, 
SUM(IF(clicks_click_type` == '1',1,0)) as keywords,
SUM(IF(clicks_click_type` == '2',1,0)) as offer_clicks,
FROM track_clicks 
GROUP BY clicks_network_subid_data
ORDER BY clicks_network_subid_data DESC
0 голосов
/ 23 сентября 2011

Прежде всего, ваш вопрос немного неясен, однако, проверьте этот запрос. я подозреваю, что вам нужно подсчитывать результаты в столбцах (одиночных) вместо строк.

select * , count(type_one) as t1_count , count(type_two) as t2_count from (
select  data,if(tmp.type=1,1,0) as type_one, if(tmp.type=2,1,0) as type_two      from  (
    select 1 as id , 'hello' as data , 1 as type , 1 as data3  union
    select 2 as id , 'goodbye' as data , 1 as type , 1 as data3 union
    select 3 as id , 'goodbye' as data , 1 as type , 2 as data3 union
    select 4 as id , 'goodbye' as data , 2 as type , 1 as data3 union
    select 5 as id , 'hello' as data , 2 as type , 1 as data3  
) tmp
) tmp2

group by tmp2.type_one ;

дайте мне знать, если это работает для вас

ура :) 1006 *

0 голосов
/ 23 сентября 2011

Вы можете сделать это, используя GROUP BY:

SELECT data, COUNT(*) AS cnt FROM `table` GROUP BY type ORDER BY COUNT(*)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...