Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > объединить 2 запроса в 1 через JOIN + WHERE


Автор: JEEN 27.7.2010, 13:32
Код

<?php
$sql = mysql_query('SELECT sp_id, sp_name FROM specialty ORDER BY sp_id') or die(mysql_error());
while ( $row = mysql_fetch_assoc($sql) ):
?>
<tr>
    <td><?php echo $row['sp_name']; ?></td>
    <td>
    <?php
        $sql_gr = mysql_query("SELECT count(*) as count FROM groups WHERE gr_specialty = {$row['sp_id']}") or die(mysql_error());
        $count = mysql_fetch_row($sql_gr);
        if ($count[0] == 0) {
            echo "Удалить"
        } else { 
            echo "Нельзя удалять"
        }
    ?>
    </td>
</tr>
<?php endwhile; ?>

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

specialty
sp_id | sp_name

groups
gr_id | gr_name | gr_specialty

Автор: letsgo 27.7.2010, 13:40
SELECT t1.sp_id, t1.sp_name, count(t2.gr_id) as count
FROM t1
LEFT JOIN t2
ON t2.gr_specialty = t1.sp_id
GROUP BY t1.sp_id

Дальше включаете while/
if ($row['count'] == 0) {
...
}

Автор: JEEN 27.7.2010, 13:51
Спасибо!


столкнулся еще с одной проблемой..

student
id  |  name      |  group_id
++++++++++++++++++
1   |  Женя      |    12
2   |  Ваня       |    10
3   |  Миша      |    12

group
 id   | name     | specialty_id
++++++++++++++++++++
10   | 323гр.   |   1
11   | 434гр.   |   2
12   | 232гр.   |   2

specialty
id    | name 
+++++++++
1     | Информатика
2     | Математика

------------------------------
я пытаюсь сделать выборку, т.е. выбираю нужную мне специальность, скрипт выводит студентов которые учатся на этой специальности, но как видите в таблице студентов есть только поле с id группы.
Пример: через форму получаю id специальности (например 2), узнаю у этой специальности группы (в данном случае группы с id 11 и 12) и ищу студентов которые учатся в этой группе (Женя и Миша).
как это можно сделать?

вот так вроде работает...
Код

LEFT JOIN specialty ON groups.gr_specialty = specialty.sp_id WHERE specialty.sp_id = {$specialty}


Вариант 1: не правильно считает $row_count, в данном случае считает количество групп, удовлетворяющих условию, а не студентов
Код

$where = "LEFT JOIN (specialty) ON (groups.gr_specialty = specialty.sp_id) WHERE groups.gr_id = {$specialty}";
$sql_count = mysql_query("SELECT * FROM (project, groups) {$where} GROUP BY groups.gr_id") or die('Ошибка');
$row_count = mysql_num_rows($sql_count); // кол-во записей в таблице

Вариант 2:  Так считает сколько всего студентов, и не обращает внимания на условие...
Код

$sql_count = mysql_query("SELECT * FROM (project, groups) {$where}") or die('Ошибка');

Вариант 3: Выводит ошибку Unknown column 'groups.gr_specialty' in 'on clause'
Код

$sql_count = mysql_query("SELECT * FROM project {$where}") or die('Ошибка');

все 3 варианта содержат ошибку...

Автор: ZneP 1.8.2010, 22:03
Выборка студентов, названия групп и названия специальностей по id специальности:

SELECT st.name, g.name, sp.name
FROM students st
LEFT JOIN group g ON g.group_id = st.group_id
LEFT JOIN specialty sp ON sp.id = g.specialty_id
WHERE sp.id = {$specialty}
GROUP BY st.name, g.name, sp.name

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