2014-10-31 4 views
2

Скажем, у меня была база данных, хранящая данные из последних футбольных матчей с моими друзьями. Я бы сохранил имена моих друзей в каждой строке без особого порядка. Как я могу вытащить эти данные, не пропуская каждую строку, ища каждое значение в каждом столбце?Выбор строк с одинаковым значением из разных столбцов

Вот пример таблицы:

gameID player1  player2 player3 ....... 
1  John  Chance  Gordon 
2  Jim   Gordon  John 
3  Derek  Chance  Richard 

Как я мог выбрать те строки, которые Джон играл в только на основе, если он был в любой колонке? Я планирую положить их в массив PHP и подсчитать их внешний вид. Что является наиболее эффективным способом проверки каждые столбцы не делать что-то вроде:

$playerarray=array{'Derek','John','Gordon','Richard','Jim','Chance',....} 
foreach($playerarray as $key => $value){ 
    //Is this even horribly inefficient? 
    $sql = mysql_query(SELECT * from game_table WHERE player1='$value' OR player2='$value' OR player3='$value'...) 
} 
+1

сколько разных друзей/игроков у вас есть? – Sharky

+0

В моей проблеме около 60 различных игроков, которые могут принимать около 16 мест за игру. – Kragalon

+0

, пожалуйста, добавьте к вопросу, важно ли это «положение» игрока. например, если john является player2, тот же, если john является player1? – Sharky

ответ

1

SQL-оператор, что вам нужно, это следующее:

SELECT * FROM game_table WHERE CONCAT_WS(',', player1, player2, player3) LIKE '%John%' 

Этот запрос возвращает все поля строк, где Джон приходит в: первые колонны 3 игроков сцепляются с запятыми, а затем искали ли Джон в нем.

Если вы просто хотите, чтобы сосчитать их:

SELECT COUNT(DISTINCT gameID) as numberofmatches FROM game_table WHERE CONCAT_WS(',', player1, player2, player3) LIKE '%,John,%' OR CONCAT_WS(',', player1, player2, player3) LIKE 'John,%' OR CONCAT_WS(',', player1, player2, player3) LIKE '%,John' 

Или, если вы хотите получить список всех игроков:

(SELECT DISTINCT player1 AS player FROM game_table) UNION 
(SELECT DISTINCT player2 AS player FROM game_table) UNION 
(SELECT DISTINCT player3 AS player FROM game_table) 
ORDER BY player 

Вы также мог бы объединить это с предыдущим, что дает мне точно так, как вы хотите (я думаю):

SELECT player,count(distinct gameID) as numberofgames FROM game_table t1 JOIN ((SELECT DISTINCT player1 AS player FROM game_table) UNION (SELECT DISTINCT player2 AS player FROM game_table) UNION (SELECT DISTINCT player3 AS player FROM game_table) ORDER BY player) t2 WHERE t2.player=t1.player1 OR t2.player=t1.player2 OR t2.player=t1.player3 GROUP by t2.player 

Это возвращает вам таблицу с именами всех разных плат в том числе количество игр, в которые они играли!

Если вы хотите выбрать только определенный человек (Джон), сделайте следующее:

SELECT player,count(distinct gameID) as numberofgames FROM game_table t1 JOIN ((SELECT DISTINCT player1 AS player FROM game_table) UNION (SELECT DISTINCT player2 AS player FROM game_table) UNION (SELECT DISTINCT player3 AS player FROM game_table) ORDER BY player) t2 WHERE (t2.player=t1.player1 OR t2.player=t1.player2 OR t2.player=t1.player3) AND t2.player='John' GROUP by t2.player 
+0

Я сделаю это. Благодаря! – Kragalon

+0

Одна вещь, в моей ситуации есть игроки, у которых есть имена внутри другого имени. Например: Джон и Джонатан. Их счет будет запутан с установкой 'LIKE '% John%'. Будет ли «EQUAL TO» John'' работать? – Kragalon

+0

попробуйте последний запрос, там они будут рассматриваться как отдельный человек! В запросе с 'LIKE' он не будет работать, так как вы проверите, находится ли« Джон »в запросе« Джон, Шанс, Гордон »или« Гордон, Джонатан, Другой ». Также 'EQUAL' не сработает! – DaveG

0

Вы можете использовать «IN» пункт как:

$playerarray = array{'Derek','John','Gordon','Richard','Jim','Chance',....}; 
$sql = mysqli_query("SELECT * from game_table WHERE player1 IN (" . $value . ") OR player2 IN (" . $value . ") OR player3 IN (" . $value . ") OR player4 IN (" . $value . ")"); 

Кроме того, не использовать MySQL, но Mysqli функции, первый из них лишен.

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

+0

Спасибо! Является ли 'IN' быстрее моего примера? – Kragalon

+2

Поскольку вы не зацикливаетесь на игровом поле и выполняете только запрос select, как только я скажу, что это быстрее. Запрос на него будет медленнее. – Adimeus

Смежные вопросы