Как вывести две связанных таблицы. (( фирма (1,2,3) - список сотрудников))?

kumich

Новичок
Как вывести две связанных таблицы. (( фирма (1,2,3) - список сотрудников))?

Подскажите, пожалуйста, новичку. Нужно вывести несколько таблиц со структурой - в названии шапки название фирмы, в теле таблицы - список сотрудников. Додумался только до самого простого и очевидного

$sql = "SELECT firm_id, firm_name, name " .
"FROM firm " .
"INNER JOIN users ON firm_id = users.firm " .
"ORDER BY firm_name";


$result = mysql_query($sql)
or die (mysql_error());
while ($row = mysql_fetch_array($result)) {

<?php echo $row['firm_name']; ?>

<?php echo $row['name']; ?>

}

?>

Но так оно выводит построчно каждую строчку массива сотрудников по принципу - фирма - сотрудник.

А их нужно сгруппировать и развести по разным таблицам, где в шапке - название фирмы - а теле пронумерованный (или нет) список сотрудников относящихся к той или иной фирме.

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

Bitterman

Новичок
Сгруппировать полученные рез-ты в ПХП и вывести так, как тебе надо. Как-то так:
Код:
$Firms = array();
while ($row = mysql_fetch_array($result)) 
   $Firms[$row['firm_name']][] = $row['name'];
После этого посмотри, что у тебя в массиве $Firms и выводи.
 

kumich

Новичок
Bitterman

Если честно - не разобрался я :( Не получается у меня вывести результаты. По всякому крутил - получается отобразить название фирмы, а вместо сотрудников отображается название array.

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

Bitterman

Новичок
Хм. Знаешь почему тебе отображается "название" array? Потому что это array и есть. А как вывести массив ты должен знать. У тебя должно получиться два вложенных цикла.

А как ты решил проблему?
 

kumich

Новичок
Bitterman

Хм. Знаешь почему тебе отображается "название" array? Потому что это array и есть.
--------------------------------

Да я это понял. Просто хотел таким образом сказать, что удалось отобразить само наличие массива, но не удалось отобразить контент этого массива :)

А как решил проблему - нашел похожий пример, поправил там некоторые детали и получилось. Там в синтаксисе лист (кей велью), а первый массив делал через foreach

На свежую голову сделал и второй массив через форич и получилось. Ошибки синтаксиса были, вот с первого раза и не получилось.

Кстати, может в этой теме ответят специалисты - а как вывести следующую структуру.

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

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

А ниже выводим для каждого значения первого массива - 4 ряда различных *(однопорядковых значений) из второго массива (которые не вложенные друг в друга а однопорядковые).

Как сделать и с синтаксисом если не сложно помогите.
 

Bitterman

Новичок
1. Так и не понял почему не удалось отобразить содержимое массива. Foreach, судя по всему, ты знаешь, так что помешало?
2. Если ты думаешь, что если описывать код словами, то всем все будет понятно - ты глубоко заблуждаешься.
3. Как выглядит массив лучше всего показывает функция print_r или var_dump.
4. По-моему, топик перестает иметь уже всякое отношение к MySQL.
 

kumich

Новичок
1. Так и не понял почему не удалось отобразить содержимое массива. Foreach, судя по всему, ты знаешь, так что помешало?
Ошибки синтаксиса :(

2. Если ты думаешь, что если описывать код словами, то всем все будет понятно - ты глубоко заблуждаешься.
В прошлом примере, у нас было, что значения одного массива были шапкой, а значения второго были телом таблицы. Два этих массива состояли из двух рядов. Теперь у нас в примере есть первый массив - один ряд. А второй "массив" несколько рядов. К примеру,

$sql = "SELECT year, firm1_name, firm2_name, " .
"FROM firm " .
"ORDER BY year";

Нужно отобразить данную информацию в виде таблицы

-------------------------
-------2006------------
-------------------------
фирма1а | фирма2а
фирма1b | фирма2b

--------------------------
---------2005-----------
--------------------------
фирма1а | фирма2c
фирма1d | фирма2f

И так несколько таблиц по годам, шапка одна, а в двух колонках фирмы с двух разных столбцов таблицы базы данных.


3. Как выглядит массив лучше всего показывает функция print_r или var_dump.
Спасибо.

4. По-моему, топик перестает иметь уже всякое отношение к MySQL.
Может быть, но так как проблема приблизительно та же, чтобы не создавать новую ветку, спрашиваю уже здесь.
 

Bitterman

Новичок
у нас в примере есть первый массив - один ряд. А второй "массив" несколько рядов.
И что это принципиально меняет? Точно также формируешь массив где ключи - года, а элементы - массивы с нужными тебе значениями. Значения можно располагать подряд, как в предыдущем примере (тогда придется приложить некоторое усилие, чтобы вывести в нужном тебе виде), или попарно (то есть сделать еще один уровень подмассивов). Дерзай.
 

kumich

Новичок
Bitterman


Не получается немного.

Вот такой вот код.

<?php
require_once 'conn.php';

$sql_2 = "SELECT year, firm1, firm2 " .
"FROM catalog " .
"ORDER BY year";

$result_2 = mysql_query($sql_2)
or die("<font color=\"#FF0000\">Query Error</font>" .
mysql_error());

while ($row_2 = mysql_fetch_array($result_2))
{
$firms = array($row_2['year'] => array($row_2['firm1'], $row_2['firm2']));


foreach ($firms as $obj_key => $obj)
{
echo '<TABLE cellSpacing=0 cellPadding=8 width=150 bgColor=#ffffff border=1>';
echo '<tr><td>';
echo "$obj_key";
echo '</td></tr>';

echo '<tr><td>';

foreach ($obj as $key => $value)
{
echo "$value<br>";
}
echo '</td></tr>';
}
echo '</table><br>';
}


?>

В шапке получается вывести значение - года. Но вот не получается вывести в теле два столбца. Не получается потому что $value воспринимается как цельное число состоящее из значений $row_2['firm1'], $row_2['firm2']) и они, естественно, выводятся в одном столбце - а вот как их разделить на два столбца (как эту переменную велью разделить на два числа не могу понять :-()

Помоги, пожалуйста!
 

Bitterman

Новичок
А если самому подумать? В твоем коде значения разделяются тегом <br>. Каким образом их надо разделить, чтобы получилось 2 столбца таблицы?
P.S. Твой код, кстати, будет работать только если для каждого года имеется только 2 значения. И в твоем варианте циклы не нужны вообще (только while), так как все значения ты знаешь.
 

kumich

Новичок
А если самому подумать? В твоем коде значения разделяются тегом <br>. Каким образом их надо разделить, чтобы получилось 2 столбца таблицы?
Готово! :)

echo '<tr>';

foreach ($obj as $key => $value)
{
echo '<td>';
echo "$value";
echo '</td>';

}
echo '</tr>';


P.S. Твой код, кстати, будет работать только если для каждого года имеется только 2 значения.
Ага, получается, если для одного года есть несколько значений - они выводятся по два несколько раз.

Насколько я понял, проблема зарыта вот здесь

$firms = array($row_2['year'] => array($row_2['firm1'], $row_2['firm2']));

Так?

нужно как-то по другому представить эту информацию? Подсказки будут?
 

Bitterman

Новичок
Нужно сначала сформировать массив, а потом уже его выводить. А ты все делаешь одновременно. Для начала сделай это.
 

kumich

Новичок
Bitterman

В литературе, которую я читал, там примеры вот такие

$firms = array($row_2['year'] => array($row_2['firm1'], $row_2['firm2']));

Правда они там гораздо проще. Сразу указываются значения вбуквенном виде. Эта же формула представляет информацию типа

1999 это ключ 1, 2 это id фирмы.
1999 ключ - 2, 3 id фирмы.

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

$Firms = array();
while ($row = mysql_fetch_array($result))
$Firms[$row['firm_name']][] = $row['name'];

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

Вот от этой структуры и нужно отталкиваться. вот только, как к
$row['name']; вписать второй столбец :) Для этого нужно знать саму структуру данной строки и как правильно представить связи между столбцами.
 

Bitterman

Новичок
kumich
Давай попробуем зайти с другого конца. Подумай, какой массив тебе было бы удобнее всего выводить в том виде, в котором тебе надо. Когда придумаешь - напиши. После этого надо будет решить как его можно получить из исходных данных.
 

kumich

Новичок
Подумай, какой массив тебе было бы удобнее всего выводить в том виде, в котором тебе надо.
Сейчас у нас после выборки из базы данных есть информация в следующем виде.


2001 3 4
2000 1 2
2000 1 4
2000 2 4
1999 2 1
1999 3 2

Нам нужно преобразовать данную информацию в другой формат. Нужно, чтобы программа выбрала из первой колонки уникальные (единичные) данные - ну то есть чтобы взяла из двух 1999 - только одно и преобразовал информацию в другой вид.

2001

3 4

2000

1 2
1 4
2 4

1999

2 1
3 2

или

2001 3 4
2000 1 2 1 4 2 4
1999 2 1 3 2

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

ТО есть для 2000 именно

1 2
1 4
2 4

а не

1 4
2 2
1 4
 

baev

‹°°¬•
Команда форума
1. Отсортировать по ключу.
2. Вывести foreach'ем
2а. Год выводить если только не равен предыдущему выведенному году.

Никакую информацию в «другой формат» преобразовывать не надо.
 

Bitterman

Новичок
kumich
Верно. Следовательно, первое, что нужно сделать - это понять как сформировать массив, где ключами будут выбранные года. Для этого достаточно записи такого вида -
$Years[год] = что-то;
Вместо слова "год" надо подставить само значение года, которое содержится в массиве $row_2.
Теперь о том, что должно стоять вместо слова "что-то". Там должен быть, как ты уже написал выше, массив значений, относящихся к данному году. Так как, мы не можем получить их все сразу, то придется добавлять попарно. То есть надо добавлять еще один массив, который будет состоять из 2 значений нужных тебе. Так как пар может быть несколько, то следует записать так:
$Years[год][] = пара значений;
Попробуй реализовать это и покажи что получилось.

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

baev

‹°°¬•
Команда форума
Bitterman,так года уже в качестве ключей:
1999 это ключ 1, 2 это id фирмы.
1999 ключ - 2, 3 id фирмы.
Если «хочется странного», нужно лишь чуть-чуть алгоритм поменять:
1. Отсортировать по ключу.
2. foreach: если год не равен предыдущему, создаём новый элемент массива, в него
2а. ещё одним foreach'ем добавляем элементы, пока год не поменяется
 

Bitterman

Новичок
baev
года уже в качестве ключей:
Я просто еще раз описал алгоритм с самого начала.
нужно лишь чуть-чуть алгоритм поменять
Честно говоря не понял предложения. Если это алгоритм заполнения массива, то откуда там вообще циклы foreach, тем более два?
 
Сверху