Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak odbudować tablicę bez powtórzeń i innych ograniczeń?

Oto, co w końcu wymyśliłem, co zadziałało (po nieudanej próbie zbudowania zapytania, którego potrzebowałem, aby osiągnąć to samo)...

Oryginalna tablica $theresults zawiera wszystkie 60 pytań z 5 różnych kategorii. Zaczynam od zbudowania tablicy wszystkich kategorii pytań...

// Create array of all categories
$allcategories = array();
$this->db->select('category_id');
$this->db->where('template_id',$template_id);
$query_thecategories = $this->db->get('categories');
$number_thecategories = $query_thecategories->num_rows();
if ($number_thecategories>0) {
    foreach ($query_thecategories->result() as $row_thecategory) {
        $thecategory = 'cat_' . $row_thecategory->category_id;
        $$thecategory = '0';
        $allcategories[] = $row_thecategory->category_id;
    }
}

Następnie używam następującej funkcji, aby wyciągnąć wszystkie unikalne kombinacje kategorii...

function array_search_by_key($array, $key, $value) {
    if(!is_array($array)) {
        return [];
    }
    $results = [];
    foreach($array as $element) {
        if(isset($element[$key]) && $element[$key] == $value) {
            $results[] = $element;
        }
    }
    return $results;
}

$uniquecombos = uniquecombos($allcategories, 2);

Na koniec przechodzę przez każdą kombinację, aby wyciągnąć pytania pasujące do każdej kategorii w parze i zapisać wynik w nowej tablicy. (Zapętlam go trzy razy, ponieważ każde parowanie kategorii zostanie użyte trzy razy (10 kombinacji par pytań x 3 pętle =60 pytań). Usuwam również każde pytanie, które wyciągam z oryginalnego $theresults tablica, aby upewnić się, że nie ma duplikatów...

// Create an empty array to capture the paired questions
$pairs = array();

// Loop through unique combos array 3 times to build pairings
for($combos = 1; $combos <= 3; $combos++) {
    foreach ($uniquecombos as $theset) {
        // Get two categories in pair
        $firstcategory = $theset[0];
        $secondcategory = $theset[1];

        // Gather other arrays which matches each category
        $matchesfirst = array_search_by_key($theresults,'category_id',$firstcategory);
        shuffle($matchesfirst);
        $matchessecond = array_search_by_key($theresults,'category_id',$secondcategory);
        shuffle($matchessecond);

        // Get question from each new array & add; remove selected question from the original array
        $pairs[] = $matchesfirst[0];
        unset($theresults[$matchesfirst[0]['question_id']]);
        $pairs[] = $matchessecond[0];
        unset($theresults[$matchessecond[0]['question_id']]);
    }
}

Mam nadzieję, że to pomoże komuś innemu!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Samodzielny serwer MySQL

  2. Zduplikowany wpis na INSERT po DELETE z tabeli w transakcji

  3. Uzyskaj dostęp do bazy danych mysql z innego systemu za pomocą java

  4. Aktualizacja div po kliknięciu przycisku, gdy przycisk jest generowany przez kliknięcie innego przycisku

  5. jak uzyskać różne wiersze o maksymalnej wartości