Есть три таблицы: group_listeners - fio group_contacts - fio group_company - name Мне нужно, сделать поиск-подсказчик. Искать текст по трем таблицам group_listeners.fio, group_contacts.fio и group_company.name затем всё это выводить в одно поле name. Я сделал это так: PHP: $search = mb_strtolower($request->post('text')); return Company::find() ->alias('gc') ->select([ 'gc.id as client_id', 'TRIM(CONCAT_WS(\' \', gc.name, gl.fio, gct.fio)) as name', ]) ->innerJoin('group_listeners as gl', 'gl.client_id = gc.id') ->innerJoin('group_contacts as gct', 'gct.client_id = gc.id') ->distinct('gc.name, gl.fio') ->orWhere(['like', 'gc.name', $search]) ->orWhere(['like', 'gl.fio', $search]) ->orWhere(['like', 'gct.fio', $search]) ->asArray() ->all(); Однако теперь все три поля выводятся в одно. Но мне нужно как-то Мне нужно сделать так, чтобы наилучшее совпадение попадалось в name. есть карточка в ней Иванов А.А. указан в 3х местах с id (к примеру 1000) и есть карточка где Иванов Б.Б. указан в 2х местах с id (к примеру 1001) и есть карточка где совпадающий с первой Иванов А.А. указан в 1х месте с id (к примеру 1002) то при вводе Иванов должно выпадать всего 3 варианта Иванов А.А. со ссылкой на id 1000 Иванов Б.Б. со ссылкой на id 1001 Иванов А.А. со ссылкой на id 1002 Поле name сейчас выведет Иванов А.А Иванов Б.Б. Иванов А.А., но мне нужно только Иванов У меня не получается выводить только совпадение Как это можно сделать?
Полностью поддерживаю. Однако у меня задача реализовать только это. Переделка бд не входит в мои обязанности. Я уже сам не рад увиденному) Пока что решил сделать тремя запросами в базу в разные Таблицы. А руки таким оторвать надо. Согласен))))
Так если тебя интересует только Иванов, тогда зачем в запросе используешь Ф,.О. ? Отбрось их. Либо группируй по имени. Или я задачу не ясно понял
А я не понял что значит наилучшее совпадение. Это помоему ключевой момент Как хотелку сформулируешь, так и поедет.
Я кажись догнал что он хочет. Ему надо вывести только одну фамилию Иванов, без инициалов. Только хз зачем, и к чему там id
я понял, как мне кажется! если у этих ивановых разные id, то нет смысла выводить склеенную строку из трех разных таблиц, в одной из которых есть иванов. значит здесь не нужен не только WS_CONCAT(), но и join-ы. реально надо три запроса!!! но их можно склеить "вертикально", а не "горизонтально" — через операцию union. я не знаю как на этом построителе запросов применить union. это что вообще, Yii? на чистом и честном SQL это выглядит как-то так: Код (SQL): SELECT x.* FROM ( SELECT id, name FROM company UNION SELECT gl.client_id AS id, gl.fio AS name FROM group_listeners AS gl UNION SELECT gct.client_id AS id, gct.fio AS name FROM group_contacts AS gct ) AS x WHERE x.name LIKE 'Иванов%'
>>>>>> если у этих ивановых разные id, то нет смысла выводить склеенную строку из трех разных таблиц, в одной из которых есть иванов. значит здесь не нужен не только WS_CONCAT(), но и join-ы. реально надо три запроса!!! Вы, скорее всего правы. Но вот заказчику так нужно) Поэтому голову ломал. И в итоге делал так. PHP: //Ищем в команиях $data = Company::find() ->alias('gc') ->select(['gc.client_id as client_id', 'TRIM(gc.name) as name']) ->orWhere(['like', 'gc.name', $search]) ->asArray() ->all(); //Если нет компаний ищем слушателей if (empty($data)) { $data = Company::find() ->alias('gc') ->select(['gc.client_id as client_id', 'TRIM(gl.fio) as name']) ->innerJoin('group_listeners as gl', 'gl.client_id = gc.id') ->distinct('gc.name, gl.fio, gct.fio') ->orWhere(['like', 'gl.fio', $search]) ->asArray() ->all(); }// Если нет слушателей ищем по контактам if (empty($data)) { $data = Company::find() ->alias('gc') ->select(['gc.client_id as client_id', 'TRIM(gct.fio) as name']) ->innerJoin('group_contacts as gct', 'gct.client_id = gc.id') ->distinct('gc.name, gl.fio, gct.fio') ->orWhere(['like', 'gct.fio', $search]) ->asArray() ->all(); } Но ваш пример поприятнее. Правда реально не понимаю зачем ему так надо. Но вот упёрся)) >>> это что вообще, Yii? Да. Именно он) В тегах тоже указал. Но я разберусь как такой Union сделать на Yii2. Хотя вполне можно оставить SQL.