Как выбрать только одну строку из таблицы с внешним соединением?
Необходимо объединить эти две таблицы в одну, но при этом телефон должен подвязаться только один раз, с условием, что если если есть основной ( phone_main=1 ), то присоединить эту запись, если основного нет, то присоединить не основной ( phone_main=0 ) Как можно сделать оптимизированный запрос, чтобы итоговая таблица получилась такой:
| USER_ID | USER_NAME | USER_PHONE |
|---|---|---|
| 1 | Иван1 | +79999999999 |
| 2 | Иван2 | +77777777777 |
| 3 | ИванЗ | +75555555555 |
| 4 | Иван4 | +74444444444 |
| 5 | Иван5 | пусто |
Есть ли возможность в join сделать проверку?
select tu.user_id, tu.user_name, tp.user_phone from table_user tu left join table_phone tp on tp.user_id=tu.user_id and (tp.phone_main = 1 or tp.phone_main = 0)
Вышеуказанный код возвращает две строки, т.к. or учитывает и то и другое. Пока только такое решение нашел:
select tu.user_id, tu.user_name, coalesce(tp1.user_phone, tp2.user_phone) from table_user tu left join table_phone tp1 on tp1.user_id=tu.user_id and tp1.phone_main = 1 left join table_phone tp2 on tp2.user_id=tu.user_id and tp2.phone_main = 0
Как с помощью select выбрать всего одну запись.
select * from table limit 1
это для MySQL и Oracle
для InterBase это возможно только в последних билдах FireBird. Про остальные — не знаю.
15 ноября 2001 года
975 / / 20.02.2000
On 2001-11-14 1438, Adonis wrote
Как с помощью select выбрать всего одну запись, удовлетворяющую некоторому критерию?
Select Top 1 * From Ваша_Таблица Where Столбец_По_Которому_Производится_Отбор Условие
Это MS SQL Server
16 ноября 2001 года
7 / / 20.01.2000
У меня Interbase 6.0, но почему-то не один из приведеных Вами примеров не работает. Может для Interbase есть какие-то особенности синтаксиса.
16 ноября 2001 года
3.7K / / 01.10.2002
Столкнулся с той-же проблемой.
В mysql все было просто LIMIT num,cnt
А вот с Oracle’ом мне не разобраться.
Может кто посоветует.
16 ноября 2001 года
7 / / 20.01.2000
На сколько мне известно в Oracle, будет типа:
select * from table_name where rownum < some_count;
А вот с InterBase, проблемка
17 ноября 2001 года
3.7K / / 01.10.2002
Не все так просто, rownum — номер записи в исходной таблице. И номера "rownum" — не упорядочены.
Я думаю, что это можно как-то обойти, но не знаю как. Может кто подскажет.
19 ноября 2001 года
7 / / 20.01.2000
А ты пробовал вьюшку создать? По-моему это вариант.
19 ноября 2001 года
3.7K / / 01.10.2002
Так это что получается, мне для каждого способа сортировки сохдавать свою вьюшку .
19 ноября 2001 года
7 / / 20.01.2000
А что если создать процедуру и ей передавать как аргумент "признак сортировки", например?
в InterBase это(создание процедуры) будет выглядеть так:
SET TERM ;/
CREATE PROCEDURE CUSTOMER_S RETURNS (
N INTEGER,
ID INTEGER,
DATE_SEM DATE,
REVISION VARCHAR(50),
TELEPHON VARCHAR(30)
) AS
BEGIN
N=0;
FOR
SELECT ID,DATE_SEM,REVISION,TELEPHON FROM SEMINAR
INTO :ID,:DATE_SEM,:REVISION,:TELEPHON
DO
BEGIN
N=:N+1;
SUSPEND;
END
END/
SET TERM /;
потом "говоришь" SELECT * FROM CUSTOMER_S;
и тебе будет выдана "таблица" вида:
"уникальный номер";id;DATE_SEM .
т.е. первый столбец будет содержать номер записи от 1 до n .
Как вывести одну строчку из mysql?
Номер id будет переменной и будет браться из get-запроса (это уже сделано).
Нужно, что бы исходя из переменной $userid, в которой будет лежать значение id выводились остальные поля из таблицы, например, в базе под находится Иванов Вася, у которого почта ivanov@gmail.com, и при $userid=5 должен произойти вывод в переменные остальных данных этой строчки, например, $user[name]=»Иванов Вася», а переменная $user[email]=»ivanov@gmail.com», что бы потом эти переменные подставить в html структуру.
- Вопрос задан более трёх лет назад
- 17932 просмотра
Комментировать
Решения вопроса 1
Веб-разработчик
1. Подключение
mysql_connect(localhost,$username,$password);
2. Запрос
$query=»SELECT * FROM user WHERE > $result=mysql_query($query);
3. Раскладываем по переменным
Если несколько строк, то либо в цикле раскидываем по переменным через mysql_result
Если одна строка то используем mysql_numrows
Как присоединить только одну строку из запроса?
Прошу помочь. Возможно решение на поверхности, но что-то не додумывается.
Есть запрос к БД для представления. В этом представлении необходимо указать для одного из полей историю изменения по месяцам. История изменения хранится в двух таблицах. Причём нужны не все изменения за месяц, а самое первое (древнее). Потому что, если в месяце было несколько изменений, все они подтянутся и основная запись в представлении задублируется, а этого быть не должно.
Сам запрос истории работает нормально:
1 2 3 4 5 6
SELECT TOP 1 D.ID, D.ID_Field, D.NewValue, P.DT_Insert, D.ID_Rec FROM dbo.s_OperDetails AS D LEFT OUTER JOIN dbo.s_Operations AS P ON D.ID_Oper = P.ID WHERE (D.ID_Field = 17267) AND (P.DT_Insert >= DATEADD(MONTH, - 3, GETDATE())) AND (P.DT_Insert DATEADD(MONTH, - 2, GETDATE())) ORDER BY D.ID
Но как только вставляешь его в представление перестаёт работать сортировка ORDER и подтягивается любое значение, но не старейшее.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
SELECT S.ID, S.REC_VER, . FROM dbo.UI34_SHIP_POS AS S LEFT OUTER JOIN dbo.UI_EQ34_SPEC AS K ON S.ID_CONTRACT = K.ID LEFT OUTER JOIN dbo.UI_EQ34_DOC AS T ON K.ID_DOC = T.ID LEFT OUTER JOIN dbo.VUI34_LIST_CONNECT AS C ON C.ID_SPEC = S.ID LEFT OUTER JOIN dbo.UI34_LIST_LIST AS L ON C.ID_LIST = L.ID LEFT OUTER JOIN dbo.VUI_EQ34_SPEC AS E ON S.ID_CONTRACT = E.ID LEFT OUTER JOIN -- тут аналогичные запросы на минус один месяц и минус два месяца (SELECT TOP 1 D.ID, D.ID_Field, D.NewValue, P.DT_Insert, D.ID_Rec FROM dbo.s_OperDetails AS D LEFT OUTER JOIN dbo.s_Operations AS P ON D.ID_Oper = P.ID WHERE (D.ID_Field = 17267) AND (P.DT_Insert >= DATEADD(MONTH, - 3, GETDATE())) AND (P.DT_Insert DATEADD(MONTH, - 2, GETDATE())) ORDER BY D.ID) AS G3 ON G3.ID_Rec = S.ID GROUP BY S.ID, S.REC_VER, .
