Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Получение одного поля привыборке из 2=х таблиц

T1
         id 
         1
         2
T2
        id pt_id
        1      1
        2      1
        3      1   
        4      2 
        5      3
Select 
    t1.id, t2.id 
from 
  t1 
left join t2
  on t1.id=t2.pt_id

В результате  такого запроса будет таблица из 5 строк, 
        t1.id  t2.id
          1        1
          1        2 
          1        3
          2        4
          2        5
а нужно получить по 1 значению для каждого id из первой таблицы. Например по максимальному id второй.
то есть 
        t1.id  t2.id
          1        3
          2        5




Это сообщение отредактировал(а) Aver78 - 4.9.2016, 19:15
Ответ:
... про остальные поля речи не было, о чем спросили, то вам разжевали. Задавайте новый вопрос.

Этот ответ добавлен с нового Винграда - 
Вопрос: Выбор данных из другой таблицы при заполнении поля

Приветствую. Подскажите пожалуйста.

Есть база данных, созданная в SQL SERVER. Имеет 3 таблицы. Связи установлены так, что при заполнении одного поля в таблице должен появляться выпадающий список, в котором данные, заполненные до этого в другой таблице. Но при запуске это поле получается не списком, а текстбоксом, где нужно все равно это вручную вводить. Подскажите пожалуйста, как это правильно сделать, в каком направлении двигаться.
Ответ:
Сообщение от DSLS
Связи установлены так, что при заполнении одного поля в таблице должен
В таблице никто никому ничего не должен. Не путайте MS SQL Server с аксесом.
Вопрос: Оптимизация вычислений нескольких вычисляемых полей в таблице

Имеется таблица tbl_Group с полями Id, calc_0, calc_1, calc_2, calc_3, ... , calc_5

В этой таблице, согласно названию полей, все, кроме Id является вычисляемым и ссылается на соответствующие функции f_0, f_1, ... , f_5

Каждая функция обращается к таблице (на самом деле табличной функции от Id группы - строки tbl_Groups) fnc_Items и отображает количество элементов в таблице по различным условиям. То есть примерно это выглядит так:

f_0:
T-SQL
1
SELECT COUNT(*) FROM tbl_Items
f_1:
T-SQL
1
2
SELECT COUNT(*) FROM fnc_Items 
WHERE x > 0
f_2:
T-SQL
1
2
SELECT COUNT(*) FROM fnc_Items 
WHERE x BETWEEN 31 AND 60
и так далее.

Таким образом мы получаем, что для того, чтобы выбрать одну строку из таблицы tbl_Group, нам необходимо обратиться к 6-ти разным функциям, которые в свою очередь 6 раз получат таблицу из функции fnc_Items чтобы применить к ней своё условие.

Вопрос заключается в том, можно ли использовать какой либо механизм кэширования или оптимизации, чтобы вызывать на одну строку в селекте таблицу fnc_Items 1 раз, а уже к результату выбора обращаться 6 раз, а не все время пересчитывать табличную функцию на каждое вычисляемое поле.

Используется MSSQL Server 2012, Transact-SQL
Ответ:
Сообщение от alex-ttt
как эта временная таблица должна создаваться и уничтожаться
ээээ как бы все в документации есть
Вопрос: Читает ли сервер строки при запросе одного поля ?

Здравствуйте.

Не могу найти ответ на вопрос как сервер физически читает данные если делается селект только одного поля таблицы ? Происохдит ли при этом чтение всей строки таблицы с диска или нет ?
Проясните пожалуста вопрос кто в курсе дела.
Ответ:
Владислав Колосов
S_A_V_e,

Вы смотрите недостаточно далеко - только на скорость выполнения.
Если будете использовать подобные запросы в приложениях
select * from persondata


Этот код потенциально содержит ошибки, т.е. имеет в виду то, что у вас в голове :)
Математика (кроме ее специальных областей, но это не тот случай) никогда не имеет что-то в виду, всегда нужно точно указывать параметры.
Вы поставите звездочку, т.е. выбрать все атрибуты, затем добавите атрибут (потом) и получите аварийное завершение, т.к. полей станет больше, чем процедура может вставить в таблицу.
То же касается схемы объекта. Во-первых Вы не можете гарантировать, что схема будет указана по умолчанию для соединения, во-вторых можете нарушить логику, создав объекты с одинаковыми именами в разных схемах. Говорить, что "такое никогда не произойдет" нельзя, все равно, что сказать - стакан никогда не разобьется.

Всегда указывайте алисы для полей выборки, указывайте список полей и указывайте схемы. Получите надежный код.


новому поколению, пришедших в разработку БД, лениво не только клавиши нажимать, но и гуглить, читать
Вопрос: В одной таблице два FK на один PK другой таблицы

Здравствуйте.
Есть таблица содержащая два FK на один PK второй таблицы. В общем, если упростить до предела будет так:
CREATE TABLE [A_RUser] ( --Реестр пользователей
	[UserId] [int] NOT NULL ,
	[Family] [varchar] (50) NOT NULL ,
	CONSTRAINT [PK_A_RUser] PRIMARY KEY CLUSTERED ([UserId]) ON [PRIMARY] 
) ON [PRIMARY]
GO

CREATE TABLE [A_Transfer] ( --Акт передачи
	[TransId] [int] IDENTITY (1, 1) NOT NULL ,
	[User_Sender] [int] NOT NULL ,
	[User_Receiver] [int] NOT NULL ,
	[Volume_Transfer] [int] NOT NULL ,
	CONSTRAINT [PK_Trans] PRIMARY KEY CLUSTERED ([TransId]) ON [PRIMARY],
	CONSTRAINT [FK_TransReceiv_RUser]	FOREIGN KEY ([User_Receiver])	REFERENCES [A_RUser] ([UserId]),
	CONSTRAINT [FK_TransSend_RUser]		FOREIGN KEY ([User_Sender])	REFERENCES [A_RUser] ([UserId])
) ON [PRIMARY]
GO
--Наполняем данными
INSERT INTO A_RUser(UserId, Family) VALUES(1, 'Иванов')
INSERT INTO A_RUser(UserId, Family) VALUES(2, 'Петров')
INSERT INTO A_RUser(UserId, Family) VALUES(3, 'Сидоров')
GO
INSERT INTO A_Transfer(User_Sender, User_Receiver, Volume_Transfer) VALUES(1, 2, 10)
INSERT INTO A_Transfer(User_Sender, User_Receiver, Volume_Transfer) VALUES(2, 3, 5)
INSERT INTO A_Transfer(User_Sender, User_Receiver, Volume_Transfer) VALUES(3, 1, 5)

Хоть и упростил до безобразия, но думаю суть понятна.
Вопрос: С одной стороны, все как бы логично, вполне себе нормальное представление реальной ситуации "сегодня петров отправитель, Сидоров получатель, завтра наоборот".
Но с другой стороны какая то ерунда. Каскадное удаление, обновление связанных записей не допустимо (для обоих связей одновременно на MS SQL Server). Запросы с "вытаскиванием через связь", в данном случае Фамилий, ... какие то ... конкретно в этом примере нормально, но ... Если связь будет "длиннее", например через FK через таблицу A_RUser(как "промежуточную") в свою очередь, так же через FK придется "тащить" еще что нибудь из третей таблицы то такая "этажерка" получится.
Короче вопрос, по моему "структура!" какая-то ущербная, то ли таблицы не хватает, то ли Чего? По моему ситуация стандартная, но мой мизерный опыт не позволяет найти решение. Помогите пожалуйста.
Ответ:
ru_efim
Предположим поле A_Transfer.User_Receiver не является обязательным (ну вот передал в некуда и все (предположим, по пустому полю мы определяем например утерю)!). Я вот, сходу, не могу придумать, как построить запрос, возвращающий такой же набор, как приведенный запрос выше. Хотя всего ДВЕ таблицы.



ты еще и SQL не знаешь...
Вот тебе и кажется все.
Короче, для тебя специально - когда кажется, перекрестись и учи SQL.

А тут надо LEFT JOIN.
Вопрос: DISTINCT по одному полю с выводом значений по остальным

Подскажите пожалуйста как сделать DISTINCT по одному полю c максимальной датой чтобы при этом также выводились значения остальных полей. Вот этот вариант выводит только уникальные значения поля ip а все остальные поля (date и id) остаются пустыми. Функция GROUP BY работает крайне медленно и не совсем корректно а также загружает сервер так что он просто зависает на какое-то время.

PHP
1
$db = @mysql_query("SELECT DISTINCT ip FROM " . $CONFIG['database_table_prefix'] . "uservisit ORDER BY date DESC LIMIT $from,$limit");
Ответ: К сожалению я не понимаю как применить эту информацию к моему случаю наверное ввиду того что не являюсь программистом.
Я ничего не смог найти в интернете, вот этот вариант используемый в другой CMS работает очень быстро и полностью корректно, я вижу что в нем используется distinct, но как использовать это к моей ситуации я не понимаю так как синтаксис изначально другой. Вы можете подсказать что нужно добавить в мой sql запрос что-бы получить тот же результат ?
PHP
1
2
3
4
5
6
7
8
9
10
11
function actionVisitorStatistics() {
        $dbC = Yii::app()->db->createCommand();
        $dbC->distinct = true;
        $dbC->select('id, ip as ' . Terms::IP . ',count(ip) as ' . Terms::COUNT . ',Max(date) ' . Terms::LAST_VISITED);
        $dbC->from('uservisit');
        $dbC->order('MAX( date ) DESC');
        $dbC->group('ip');
        $results = $dbC->queryAll();
 
        $this->render('visitorStatistics', array('data' => new CArrayDataProvider($results)));
    }
Добавлено через 21 минуту
Вот этот вариант работает но очень медленно и выводит также несколько одинаковых значений с ip и датой если они присутствуют в таблице.

MySQL
1
$db = @mysql_query("SELECT * FROM  " . $CONFIG['database_table_prefix'] . "uservisit WHERE (ip, date) IN (SELECT ip, MAX(date) FROM uservisit GROUP BY ip) ORDER BY date DESC LIMIT $from,$limit");
Мне всего лишь нужно что-бы при использовании функции DISTINCT помимо вывода уникальных значений IP c максимальной датой выводились и остальные поля, кто знает синтаксис sql пожалуйста подскажите как это сделать ?
Вопрос: Нужно вывести данные из 2-х полей присоединенной таблицы

Нужно вывести данные из 2-х полей присоединенной таблицы

так вывожу поле name1 таблицы table2

select table1.id, table2.name1 from table1 join table2 on table1.name_id=table2.id


но мне нужно еще выводить name2 таблицы table2, которое то же соответствует table1.name_id

Как изменить запрос ?

К сообщению приложен файл. Размер - 104Kb
Ответ: terlalex,

В приведенной структуре таблиц в table2 нет поля name2.
Задача не имеет решения.
Вопрос: Как вывести количество одинаковых значений одного поля из таблицы

Привет всем!

Есть таблица фруктов с двумя полями category, name. Категории повторяются (про distinct знаю), а как вывести количество наименований в каждой категории в виде

category | count name

цитрусовые 4
ягоды 2
Ответ: string_out,

group by + count
Вопрос: Ссылка на поле '|' может относиться к полям нескольких таблиц ...

Доброго времени суток.

Напомните, пожалуйста, в каких случаях возникает сообщение "Ссылка на поле '|' может относиться к полям нескольких таблиц перечисленных в предложении FROM инструкции SQL". Имя поля указано именно так: '|'. Когда-то неоднократно с этим сталкивался, но начисто забыл из-за чего это происходит.

Заранее премного благодарен.
Ответ: K-Nick,

может есть имя поля которое не желательно к использованию, типа Name, Date, If,...
Вопрос: Сложный запрос: одним запросом вывести таблицу с наибольшим количеством сотрудников

Здравствуйте!

Имеется БД с несколькими таблицами сотрудников разных отделов.
--нужно с помощью одного запроса вывести таблицу с наибольшим количеством сотрудников.
--Суть заключается в том, что таблиц может быть очень много и чтобы не искать в ручную таблицу с наибольшим числом сотрудников нужно сделать это с помощью запроса,видимо сложного.

у меня не получается, прошу помощи. Заранее спасибо
Ответ:
.....зачем надо искать самое большое....
Чтобы знать, кого сокращать.

Добавлено через 7 минут
А почему человеку никто прямо не скажет, что таблица с сотрудниками должна быть одна?
Тут на днях была тема про поле с фотографией в ленточной форме.
Так там была куча таблиц электроприборов, по таблице на каждого поставщика.
Лично мною несколько раз настойчиво рекомендовалось слить в одну.
Ответ был: мне так удобно.
При том, что его неразрешимая проблема с фотографиями порождалась именно наличием множества однородных таблиц.
В конце концов, дело хозяйское...

Добавлено через 8 минут
Тем более, таблицы уже есть и задача есть.
Ответить, а потом уж советовать.