Вернуть только одну строку в подзапросе - PullRequest
0 голосов
/ 05 апреля 2020

У меня следующий запрос, который я выполняю, чтобы показать эти записи в представлении Laravel.

$companies = DB::select(DB::raw("SELECT (
            SELECT f.name FROM fields f WHERE f.id = (
                SELECT fc.field_id FROM c_f fc WHERE fc.company_id = c.id  
            )
        )field, c.name, c.email, (
            SELECT name as country FROM countries WHERE id = (SELECT country_id from states WHERE id = (SELECT state_id from cities WHERE id = (SELECT city_id from addresses WHERE id = c.address_id))) 
        )country,
        (
            SELECT name as state_name FROM states WHERE id = (SELECT state_id from cities WHERE id = (SELECT city_id from addresses WHERE id = c.address_id)) 
        )states, (
            SELECT name as city FROM cities WHERE id = (SELECT city_id from addresses WHERE id = c.address_id) 
        )city
        FROM companies c WHERE c.user_id = 1")); 

У меня проблемы с этой строкой

SELECT name as city FROM cities WHERE id = (SELECT city_id from addresses WHERE id = c.address_id)

Поскольку в моей базе данных есть много городов с одинаковыми именами, поэтому выдается ошибка (вероятно, то же самое относится и к штатам, но в этом случае ошибка выдается в городах, поэтому я попытался добавить LIMIT 1 в конце подзапрос, но он выдаёт мне ошибку, поэтому я думаю, что я не могу использовать LIMIT в подзапросе?

Это то, что я пытался изменить

SELECT name as city FROM cities WHERE id = (SELECT city_id from addresses WHERE id = c.address_id LIMIT 1)

Вот так выглядят таблицы

компании table_companies

адреса

adddress_table

города

cities

состояний

states

страны

enter image description here

Как это можно исправить?

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Вы действительно должны написать весь свой запрос как JOIN. Если он возвращает несколько строк, будет довольно легко увидеть, где ваша проблема с дублированием. Обратите внимание, что на основании написанного вами, это не связано с тем, что города имеют одинаковые названия, так как вы никогда не выбираете на основе названий. Не видя структуры данных, трудно быть уверенным, но это должно быть близко:

SELECT f.name AS field,
       c.name,
       c.email,
       r.name AS country,
       s.name AS states,
       m.name AS city
FROM companies c
JOIN c_f fc ON fc.company_id = c.id
JOIN fields f ON f.id = fc.field_id
JOIN addresses a ON a.id = c.address_id
JOIN cities m ON m.id = a.city_id
JOIN states s ON s.id = m.state_id
JOIN countries r ON r.id = s.country_id
0 голосов
/ 05 апреля 2020

Вы не предоставили пример данных и ожидаемый результат :( Все еще угадываете ваши структуры данных:

SELECT name as city 
FROM cities 
inner join addresses on addresses.city_id = cities.id 
WHERE addresses.id = c.address_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...