Почему, когда я объединяю таблицы в базе данных mysql, значения дублируются? - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь подсчитать, сколько раз значение (например, 1-е место) появляется в столбце из 3 разных таблиц.

Я объединяю 4 таблицы по идентификатору, чтобы получить нужные мне столбцы, а затем выполняюмассив, чтобы получить все значения, затем я использую array_count_values, чтобы узнать, сколько раз значение находится в таблице.

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

это мои таблицы до их объединения

Таблица 1

| dancer_id | dancer_placement1|
|    1      |   2nd Place      |
|    1      |   1st Place      |
|    3      |   4th Place      |

таблица 2

| dancer_id | dancer_placement3|
|    1      |   4th Place      |
|    1      |   1st Place      |
|    3      |   3rd Place      |
|    1      |   2nd Place      |

таблица 3

| dancer_id | dancer_placement3|
|    2      |   6th Place      |
|    3      |   1st Place      |
|    1      |   3rd Place      |

Когда я объединяю их, это выглядит так

| dancer_id | dancer_placement1|  dancer_placement2|  dancer_placement3|
|    1      |   2nd Place      |  4th Place        |  3rd Place        |    
|    1      |   1st Place      |  4th Place        |  3rd Place        |    
|    1      |   2nd Place      |  1st Place        |  3rd Place        |    
|    1      |   1st Place      |  1st Place        |  3rd Place        |
|    1      |   2nd Place      |  2nd Place        |  3rd Place        |
|    1      |   1st Place      |  2nd Place        |  3rd Place        |

На самом деле это должно выглядеть так:

| dancer_id | dancer_placement1|  dancer_placement2|  dancer_placement3|
|    1      |   2nd Place      |  4th Place        |  3rd Place        |    
|    1      |   1st Place      |  1st Place        |  null             |    
|    1      |   null           |  2nd Place        |  null             |    

Как вы можете видеть до слияния в dancer_placement1, «1-е место» и «2-е место» появляются только один раз, но после слияния они появляются 3 раза.

в dancer_placement2 1-й, 2-й и 4-й появляются один раз, но после слияния появляется по 2 раза каждый.

в dancer_placement3 3-е место появляется только один раз, а после слияния появляется 6 раз.

Я думаю, что что-то не так с моим sql, потому что все остальное работает как надо.

вот мой код:

//GET ID 

if(isset($_GET['id'])) {
    $childId=$_GET['id']; 
//I MERGE MY TABLES
    $chartsql = <<<_SQL
SELECT
  dancers.id, 
  mark_cards1.dancer_placement1, 
  mark_cards2.dancer_placement2, 
  mark_cards3.dancer_placement3 
FROM dancers 
LEFT JOIN mark_cards1 ON mark_cards1.dancer_id1 = dancers.id
LEFT JOIN mark_cards2 ON mark_cards2.dancer_id2 = dancers.id 
LEFT JOIN mark_cards3 ON mark_cards3.dancer_id3 = dancers.id 
WHERE dancers.id = '$childId'
_SQL;

$pieChartRes = mysqli_query($con,$chartsql);

 //BELOEW CODE WORKS PERFECTLY FINE

     // creating an array to find values
    while ($pieChartRow=mysqli_fetch_array($pieChartRes)){
        $first[] = $pieChartRow['dancer_placement1'];
        $second[] = $pieChartRow["dancer_placement2"];
        $third[]= $pieChartRow["dancer_placement3"];

    }

   // COUNTING THE AMOUNT OF TIMES A SPECIFIC VALUE APPEARS

    $tmp = array_count_values($first);
    $count_first = $tmp["1st place"];
    $count_second = $tmp["2nd place"];
    $count_third = $tmp["3rd place"];

    $tmp2 = array_count_values($second);
    $count_first2 = $tmp2["1st place"];
    $count_second2 = $tmp2["2nd place"];
    $count_third2 = $tmp2["3rd place"];

    $tmp3 = array_count_values($third);
    $count_first3 = $tmp3["1st place"];
    $count_second3 = $tmp3["2nd place"];
    $count_third3 = $tmp3["3rd place"];

  //PRINTING NUMBER OF VALUES

    echo "number of 1st place in dancerplacement1: $count_first";
    echo "number of 1st place in dancerplacement2: $count_first2";
    echo "number of 1st place in dancerplacement3: $count_first3";

    echo "number of 2nd place in dancerplacement1: $count_second";
    echo "number of 2nd place in dancerplacement2: $count_second2";
    echo "number of 2nd place in dancerplacement3: $count_second3";

    echo "number of 3rd place in dancerplacement1: $count_third";
    echo "number of 3rd place in dancerplacement2: $count_third2";
    echo "number of 3rd place in dancerplacement3: $count_third3";

// GETTING TOTALS

    $first_total = $count_first + $count_first2 + $count_first3;
    $second_total = $count_second + $count_second2 + $count_second3;
    $third_total = $count_third + $count_third2 + $count_third3;
    echo "total for first place = $first_total";
    echo "total for second place = $second_total";
    echo "total for third place = $third_total";

1 Ответ

0 голосов
/ 18 сентября 2018

Вместо объединения используйте объединение, как показано ниже:

select dancerid,dancer_placement1,null as dancer_placement2,null as dancer_placement3
from table1 where dancerid=1
union all
select dancerid,null,dancer_placement2,null
from table2 where dancerid=1
union all
select dancerid,null,null,dancer_placement3
from table3 where dancerid=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...