MYSQL COUNT количество совпадающих значений - PullRequest
0 голосов
/ 11 июля 2020

У меня есть база данных с 2 столбцами. character_id и killmail_id Цель состоит в том, чтобы получить список всех killmail_id с определенным c character_id, затем получить все character_ids, у которых есть совпадающие killmail_ids, и подсчитать, сколько раз появляются эти character_ids

На данный момент я получил это : ($ target - это идентификатор_символа, который нужно искать)

SELECT `character_id`, COUNT(`killmail_id`) FROM `attackers` WHERE $target NOT IN (SELECT `killmail_id` FROM `attackers` WHERE `character_id` <> $target) AND `character_id` <> $target  GROUP BY `killmail_id` ;

Это почти работает, но подсчитывает общее количество killmail_ids у персонажа. Я хочу, чтобы он подсчитывал killmail_id только в том случае, если $ target также имеет соответствующий killmail_id

, если это не имеет смысла, это то, что я использовал раньше (PHP), и я пытаюсь устранить зацикливание, указав более конкретный c SQL выпишите, если возможно.

function seenWith($target){
    $sql = "SELECT `killmail_id` FROM `attackers` WHERE character_id='" . $target . "';";
    $mySql = $db->prepare($sql);
    $mySql->execute();
    $results = $mySql->fetchAll();
    $friends = array();
    foreach ($results as $idx => $array){
        foreach ($array as $key => $value){
            $sql = "SELECT `character_id`,`killmail_id` FROM `attackers` WHERE killmail_id='$value' AND character_id<> '".$target."';";
            $mySql = $db->prepare($sql);
            $mySql->execute();
            $rData = $mySql->fetchAll();
            foreach($rData as $index => $friendName){
                array_push($friends, htmlspecialchars($friendName['character_id'], ENT_QUOTES));
            }
        }
    }
    return $friends;
}

1 Ответ

0 голосов
/ 11 июля 2020

Один из вариантов использует exists:

select character_id, killmail_id
from attackers a
where
    character_id <> :target
    and exists (
        select 1
        from attackers a1
        where 
            a1.character_id = :target
            and a1.killmail_id = a.killmail_id
    )

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...