Для целей оптимизации хорошим правилом является объединение меньше, а не больше. На самом деле, вы должны попытаться объединить несколько строк, сколько сможете, с минимальным количеством строк. При любом дополнительном соединении вы будете умножать стоимость, а не увеличивать стоимость. Поскольку mysql будет просто генерировать большую умноженную матрицу.
Но ответить на ваш вопрос: на самом деле можно рассчитывать только с одним большим соединением, предполагая, что таблицы имеют уникальные ключи, а idalb - уникальное ключ для альбома. Затем, и только тогда вы можете сделать это аналогично вашему коду:
select alb.titreAlb as "Titre",
count(distinct payalb.idAlb, payalb.PrimaryKeyFields) "Pays",
count(distinct peralb.idAlb, peralb.PrimaryKeyFields) "Personnages",
count(distinct juralb.idAlb, juralb.PrimaryKeyFields) "Jurons"
from album alb
left join pays_album payalb using ( idAlb )
left join pers_album peralb using ( idAlb )
left join juron_album juralb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON"
group by alb.titreAlb
, где PrimaryKeyFields обозначает поля первичного ключа объединенных таблиц (вы должны искать их).
Distinct
удалит эффект, который другие соединения имеют в счетчике. Но, к сожалению, в общем случае distinct
не удалит эффект, который имеют соединения, связанные с затратами.
Хотя, если у вас есть индексы, которые покрывают все поля (idAlb + PrimaryKeyFields) ваших таблиц, это может быть настолько же быстрым, как исходное решение (потому что он может оптимизировать distinct
, чтобы не сортировать) и приблизится к тому, о чем вы думали (просто пройдите через каждый стол / индекс один раз). Но в нормальном или худшем случае szenario он должен выполнять хуже, чем разумное решение (например, SlimGhost), потому что вряд ли он найдет оптимальную стратегию. Но поиграйте с ним и проверьте объяснения (и опубликуйте результаты), возможно, mysql сделает что-то безумное.
Прежде всего Вы, конечно, рассмотрели двухстороннюю привязку данных к своему viewmodel с UpdateSourceTrigger PropertyChanged? Тем путем метод set свойства свойства, с которым Вы связываете, назовут каждый раз, когда текст изменяется?
Если бы это недостаточно, то я занялся бы этой проблемой с помощью Приложенных Поведений. На Блоге Julian Dominguez Вы найдете статью о том, как сделать что-то очень похожее в Silverlight, которая должна быть легко адаптируемой к WPF.
В основном, в статическом классе (названный, скажите TextBoxBehaviours), Вы определяете Приложенное Свойство, названное (возможно), TextChangedCommand типа ICommand. Поднимите трубку обработчик OnPropertyChanged для того свойства, и в обработчике, проверьте, что свойство устанавливается на TextBox; если это, добавьте обработчик к событию TextChanged на текстовом поле, которое назовет команду указанной в свойстве.
Затем принятие Вашего viewmodel было присвоено DataContext Вашего Представления, Вы будете использовать его как:
<TextBox
x:Name="MyTextBox"
TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />
Вы не можете только обработать событие TextChanged и выполнить команду оттуда?
private void _textBox_TextChanged(object sender, EventArgs e)
{
MyCommand.Execute(null);
}
Альтернатива, как Вы говорите, должна создать a TextBox
это действует как источник команды, но это действительно походит на излишество, если это не что-то, что Вы - планирование совместного использования и усиления во многих местах.
Используя привязку события и команду метод не могла бы быть правильная вещь использовать. Что точно сделает эта команда?
Вы могли бы хотеть рассмотреть использование Привязки данных к строковому полю в Вашем VM. Таким образом, можно позвонить команде или функционировать оттуда вместо того, чтобы иметь уход UI вообще.
<TextBox Text="{Binding WorldName}"/>
....
public string WorldName
{
get
{
return WorldData.Name;
}
set
{
WorldData.Name = value;
OnPropertyChanged("WorldName");
// CallYourCustomFunctionHere();
}
}