За последние 24 часа нас посетили 21059 программистов и 1640 роботов. Сейчас ищут 948 программистов ...

Подскажите как правильно вытянуть количество элементов в массиве

Тема в разделе "PHP для новичков", создана пользователем Artur_hopf, 21 дек 2018.

  1. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Добрый день.
    Есть две таблицы

    Таблица 1:
    Id , ... и прочите параметры

    Таблица 2:

    Id, Table1_id, Name

    Нужно посчитать сколько во второй таблице параметров с одинаковыми Table1_id и вывести их в таблицу, делаю так:
    PHP:
    1. function getTable2(){
    2.    $query = new Query;
    3.    $query->select('Table1_id');
    4.    $query->from('Table2');
    5.    $result = $query->all();
    6.    if(count($result) > 0){
    7.       foreach ($result as $value){
    8.          $array = array_count_values($value);
    9.       }
    10.     return $array;
    11.    }
    12. }
    Потом напротив каждого параметра нужно вывести сколько их из второй таблицы.
    PHP:
    1. $getTable1 = getTable1();
    2. $getTable2 = getTable2();
    3.  
    4. foreach ($getTable1 as $value){
    5.       if(isset($getTable2[$value['Id']])){
    6.          $photo = $getTable2[$value['Id']];
    7.        }else{
    8.           $photo = 0;
    9.       }
    10.       //ну и вывожу $photo
    11. }

    В итоге надо просто посмотреть количество элементов с конкретным id из первой таблицы, оно работает. Но меня смущает что вторая таблица тянется полностью вся, можно этого как то избежать? И я намудрил или это можно сделать проще?
     
  2. Konstant1n

    Konstant1n Активный пользователь

    С нами с:
    14 авг 2017
    Сообщения:
    273
    Симпатии:
    1
    Адрес:
    Волгоград
    что-то вроде этого.
    PHP:
    1. SELECT t1.id, t2.id as total
    2. FROM table1 t1
    3. JOIN table2 t2 ON t1.id = t2.table1_id
    посмотри вложенные запросы. можно конечно отдельным запросом и обработать массивы.
    посмотри мои сообщения, я создавал когда-то
     
    Artur_hopf нравится это.
  3. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @Konstant1n я знаю как JOIN работает, но как сумму вытащить?
    --- Добавлено ---
    Первая таблица у меня как раз так и тянется =)
    PHP:
    1. $query = new Query;
    2. $query->select('WC.Id, WSMA.Name AS Material, WSCO.Name AS Color, WSMAN.Name AS Manufacturer, WC.Distinction,
    3. WC.Indicators, WST.Name AS WasteType, WC.Applying');
    4. $query->from('Table1 AS WC');
    5. $query->leftjoin('Table3 AS WSMA', 'WC.Material = WSMA.Id');
    6. $query->leftjoin('Table4 AS WSCO', 'WC.Color = WSCO.Id');
    7. $query->leftjoin('Table5 AS WSMAN', 'WC.Manufacturer = WSMAN.Id');
    8. $query->leftjoin('Table6 AS WST', 'WC.WasteType = WST.Id');
    9. $query->orderBy('WC.Date DESC');
    10. $result = $query->all();
    11. if(count($result) > 0){
    12. return $result;
    13. }else{
    14. return false;
    15. }
    А вот как сумму вытащить я не догоняю =(
     
  4. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @Konstant1n спасибо, нужно было все остальное запихнуть в GROUP BY зачем то, и заработало:
    PHP:
    1. $query = new Query;
    2. $query->select('WC.Id, WSMA.Name AS Material, WSCO.Name AS Color, WSMAN.Name AS Manufacturer, WC.Distinction,
    3. WC.Indicators, WST.Name AS WasteType, WC.Applying, COUNT(PH.Table1_Id) AS Photo');
    4. $query->from('Table1.dbo.Catalog AS WC');
    5. $query->leftjoin('Table2 AS PH', 'WC.Id = PH.Catalog_Id');
    6. $query->leftjoin('Table3 AS WSMA', 'WC.Material = WSMA.Id');
    7. $query->leftjoin('Table4 AS WSCO', 'WC.Color = WSCO.Id');
    8. $query->leftjoin('Table5 AS WSMAN', 'WC.Manufacturer = WSMAN.Id');
    9. $query->leftjoin('Table6 AS WST', 'WC.WasteType = WST.Id');
    10. $query->groupBy(['WC.Id','WSMA.Name', 'WSCO.Name','WSMAN.Name', 'WC.Distinction',
    11. 'WC.Indicators', 'WST.Name', 'WC.Date', 'WC.Applying']);
    12. $query->orderBy('WC.Date DESC');
    13. $result = $query->all();
    14. if(count($result) > 0){
    15. return $result;
    16. }else{
    17. return false;
    18. }