Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Помогите с запросом


Автор: izOne 5.3.2005, 21:15
Дано: две таблицы связь по mid
Задача: выбрать из таблицы table1 все строки, количество строк для которых в table2 >=, например, 3.
Пример:
table1
mid name
1 a1
2 b1
3 c1
tabel2:
id mid name
1 1 n1
2 1 n2
3 3 n3
4 2 n4
5 1 n5
6 3 n6
7 3 n7

Результат:
mid name
1 a1
3 c1

Автор: Kesh 5.3.2005, 21:20
что-нить типа
Код

SELECT t1.*, count(t2.*) AS `t2_cnt`
FROM `table1` t1, `table2` t2
WHERE (t1.`mid`=t2.`mid`)
AND (`t2_cnt`>3)

Автор: Farik 5.3.2005, 22:36
а GROUP BY разве не надо?

Автор: Kesh 5.3.2005, 23:14
Farik наверное надо... не было времени проверять... GROUP BY t1.`name`

Автор: izOne 6.3.2005, 16:12
То что вы предложили - не работает. Сейчас сделал следующее:

Код

$query = $db->query("
 SELECT mt.*, count(pt.mid) AS 'progs'
 FROM ".MENU_TABLE." AS mt
  LEFT JOIN ".PROGRAM_TABLE." AS pt ON (pt.mid = mt.mid)
 WHERE (mt.level BETWEEN 1 AND 4) AND mt.visible='true'
 GROUP BY mt.mid
 ORDER BY mt.dbtree_left
");
$html = "\n<div id='menu'>\n";
$level = 0;
   if($rs = db_fetch_array($query)){
       do{
  if( (1 == $rs['dbtree_right'] - $rs['dbtree_left']) AND $rs['progs'] <=2){
   continue;
  }
  if($rs['level'] > $level){
   $level++;
   $html .= str_repeat("\t", $level-1)."<ul>\n";
  }elseif($rs['level'] < $level){
   $level--;
   $html .= str_repeat("\t", $level)."</ul>\n";  
  };
  if($selected !== 0 AND $rs['mid'] == $selected){
   $class = " class=\"selected\"";
  }else{
   $class = "";
  }
  $html .= str_repeat("\t", $level)."<li><a href=\"http://www.".CMS_DOMAIN."/".CMS_MODULE_EXT."/listgrp/".$rs['translit']."/".$rs['mid']."/index.htm\"".$class.">".$rs['name']."</a>\n";
       }while($rs = db_fetch_array($query));
   }
$html .= "\t</ul>\n</ul>\n</div>\n";


Хотелось бы
Код

  if( (1 == $rs['dbtree_right'] - $rs['dbtree_left']) AND $rs['progs'] <=2){
   continue;
  }

Вынести непосредственно в запрос.

Автор: Kesh 6.3.2005, 18:40
izOne Вот это работает...
Код
SELECT t1.`mid`, t1.`name`, count(t2.`id`) AS `t2_cnt`
FROM `table1` t1, `table2` t2
WHERE t1.`mid`=t2.`mid`
GROUP BY t1.`name`
HAVING `t2_cnt`>=3

проверено на MySQL 4.1.10

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)