powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Выборка по массивам?
15 сообщений из 15, страница 1 из 1
Выборка по массивам?
    #38352774
Фотография Stasonix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица:

Код: sql
1.
2.
3.
4.
articles. id   | author                | title     | content  | type
             1 | author1, author2      | thetitle1 | text1    | typeA
             2 | author1               | thetitle2 | text2    | typeB
             3 | author2               | thetitle3 | text3    | typeA



С клиента приходят массивы, они являются как бы фильтрами данных:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
$conditions = array();
$where = '';

if(isset($_POST['authors'])){ //empty, is_array and etc.
  $authors = $_POST['authors']; // [ author1, author2 ]
  $conditions[] = "author IN ('".implode("','",$authors)."')";
}
if(isset($_POST['types'])){
  $types = $_POST['types']; // [ typeA, typeB ]
  $conditions[] = "type IN ('".implode("','",$types)."')";
}

if(!empty($conditions)){
  $where = ' WHERE '.implode(' AND ', $conditions);
}

$sql = "SELECT * FROM articles".$where;



Все бы ничего, да вот только поле author может содержать авторов через запятую, как видно из примера, что не подпадает под такой фильтр: `author IN ('author1')` - естественно такой фильтр выберет только 2-ую запись из таблицы, а нужно все записи где этот автор участвовал ( а это 1-ая и 2-ая записи ).
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38352910
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StasonixЕсть таблица:

Код: sql
1.
2.
3.
4.
articles. id   | author                | title     | content  | type
             1 | author1, author2      | thetitle1 | text1    | typeA
             2 | author1               | thetitle2 | text2    | typeB
             3 | author2               | thetitle3 | text3    | typeA



С клиента приходят массивы, они являются как бы фильтрами данных:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
$conditions = array();
$where = '';

if(isset($_POST['authors'])){ //empty, is_array and etc.
  $authors = $_POST['authors']; // [ author1, author2 ]
  $conditions[] = "author IN ('".implode("','",$authors)."')";
}
if(isset($_POST['types'])){
  $types = $_POST['types']; // [ typeA, typeB ]
  $conditions[] = "type IN ('".implode("','",$types)."')";
}

if(!empty($conditions)){
  $where = ' WHERE '.implode(' AND ', $conditions);
}

$sql = "SELECT * FROM articles".$where;



Все бы ничего, да вот только поле author может содержать авторов через запятую, как видно из примера, что не подпадает под такой фильтр: `author IN ('author1')` - естественно такой фильтр выберет только 2-ую запись из таблицы, а нужно все записи где этот автор участвовал ( а это 1-ая и 2-ая записи ).

Возможно при такой структуре и можно так сделать, как Вам надо.. но это же гемор :)
Как по мне нужны 3 таблицы (это по-хорошему, если об авторе также хранятся данные в базе, иначе можно 2 таблицы делать):
1. Таблица авторов.
2. Таблица записей (книг, статей или чего они там пишут)
3. Таблица связей (id автора, id статьи).

Через Join связываем таблицы в запросе и жить становится просто :)
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38352950
JustCrazy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а чем лайк не подходит ?
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38352954
JustCrazy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JustCrazyа чем лайк не подходит ?камнями не кидайтесь, мне действительно интересно)
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38352958
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustCrazy,

вместо автора отвечу ))
А как через like данную выборку сделать?
"WHERE autor LIKE '%autor1%' OR autor LIKE '%autor2%'..." ?
Во-первых это не удобно, а во-вторых - по такому запросу будут выбраны все произведения авторов autor1 и autor2, а вместе с ними autor11, autor22, autor12, someautor1 и т.д.
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38352966
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если без изменения структуры БД, то как-то так разве что:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
if(isset($_POST['authors'])){ //empty, is_array and etc.
  $authors = $_POST['authors']; // [ author1, author2 ]

  $cond  = "AND (1=0 ";
  foreach($authors AS $author) {
     $author = ','.$author.',';
     $cond.="OR INSTR(concat(',',author,',') , '$author' ) > 0 ";
  }  
  $cond.=")";

  $conditions[] = $cond;
}
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38352973
JustCrazy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрJustCrazy,

вместо автора отвечу ))
А как через like данную выборку сделать?
"WHERE autor LIKE '%autor1%' OR autor LIKE '%autor2%'..." ?
Во-первых это не удобно, а во-вторых - по такому запросу будут выбраны все произведения авторов autor1 и autor2, а вместе с ними autor11, autor22, autor12, someautor1 и т.д.
ну насколько я понял автора, если в массиве приходит 2-3 автора, то ему надо получить данные, где авторов именно 2-3, тогда и запрос можно выполнить
Код: php
1.
"WHERE autor LIKE '%autor1, autor2'..." 
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38352981
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustCrazyну насколько я понял автора, если в массиве приходит 2-3 автора, то ему надо получить данные, где авторов именно 2-3, тогда и запрос можно выполнить
Код: php
1.
"WHERE autor LIKE '%autor1, autor2'..." 




Вроде автор написал, что ему нужны:
Stasonix все записи где этот автор участвовал.

и видимо это всё-таки не для всех сразу поступивших на вход, а для каждого в отдельности
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38352991
JustCrazy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
anvanoJustCrazyну насколько я понял автора, если в массиве приходит 2-3 автора, то ему надо получить данные, где авторов именно 2-3, тогда и запрос можно выполнить
Код: php
1.
"WHERE autor LIKE '%autor1, autor2'..." 




Вроде автор написал, что ему нужны:
Stasonix все записи где этот автор участвовал.

и видимо это всё-таки не для всех сразу поступивших на вход, а для каждого в отдельности
так это он указывает для случая, когда в фильтре 1 автор, а не несколько
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38352995
JustCrazy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JustCrazyтак это он указывает для случая, когда в фильтре 1 автор, а не несколькохотя я может просто недопонимаю..
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38353011
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JustCrazyПрограмёрJustCrazy,

вместо автора отвечу ))
А как через like данную выборку сделать?
"WHERE autor LIKE '%autor1%' OR autor LIKE '%autor2%'..." ?
Во-первых это не удобно, а во-вторых - по такому запросу будут выбраны все произведения авторов autor1 и autor2, а вместе с ними autor11, autor22, autor12, someautor1 и т.д.
ну насколько я понял автора, если в массиве приходит 2-3 автора, то ему надо получить данные, где авторов именно 2-3, тогда и запрос можно выполнить
Код: php
1.
"WHERE autor LIKE '%autor1, autor2'..." 



А что произойдёт, если в базе будут авторы autor1 и someautor1 ? )) Я ведь уже написал, что это одна из причин :)
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38353012
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже если надо несколько сразу, что ты будешь делать, если в базе они в одном порядке, а на вход передали тех же авторов в другом порядке? В моём варианте можно просто по AND склеить те же самые условия вместо OR и всё будет работать
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38353064
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
SELECT GROUP_CONCAT(`autors`.`autor` SEPARATOR ', ') as `autor`, `articles`.* 
FROM `articles` 
LEFT JOIN `autor_binds` ON `articles`.`id`=`autor_binds`.`article`
LEFT JOIN `autors` ON `autor_binds`.`autor`=`autors`.`id`
WHERE [привычные автору условия, только с префиксами таблиц]
GROUP by `autors`.`id`



Любой ранее написанный код может быть сохранён без изменений с использованием GROUP_CONCAT в запросе (то есть список авторов в php будет приходить как единное поле `autor` где авторы будут расположены через запятую). Таким образом изменение структуры базы никак не скажется на php коде (кроме переписывания самих запросов разумеется).
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38355998
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stasonix $conditions[] = "author IN ('".implode("','",$authors)."')";

Все бы ничего, да вот только поле author может содержать авторов через запятую

Зато в имени автора не может быть запятой. Или у вас есть и такие авторы?

Кстати, а что будет если я напишу вместо фамилии автора с запятой в массив нечто типа DELETE * FROM author WHERE 1. Я не знаю что, просто интересуюсь как людям удается взять данные в посте и прямиком их положить в скобки кляузы IN.

Судя по авторским запятым, у вас там даже не фиксированный список, а свободный ввод.

Короче, сначала массив превращается в строку? Потом обратно в массив по разделителю запятой. Все ручные запятые дадут еще авторов. Это в представленной парадигме. Без нее надо смотреть как такого избежать вообще.

И авторов тоже надо избегать (escape), причем лучше всего каждого в отдельности. Во избежание недоразумений.
...
Рейтинг: 0 / 0
Выборка по массивам?
    #38355999
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще тут похоже требуется полнотекстовый поиск, а не рубрикатор. Иначе бы проблем с запятыми в авторах не возникло.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Выборка по массивам?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]