Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Один запрос из нескольких таблиц
 
 автор: Spenser   (21.01.2011 в 10:22)   письмо автору
 
 

Здравствуйте. Нужно сделать выборку из нескольких таблиц по условию, т.е.

SELECT COUNT(*) FROM categories, goods WHERE categories.seoname='vodonagrevateli' OR goods.seoname='vodonagrevateli'

что-то типа этого.

т.е. таблиц несколько, во всех таблицах есть поле seoname, вот и надо проверить сколько суммарно записей во всех таблицах с seoname='vodonagrevateli'.

Помогите составить запрос. читал про JOIN но так и не понял как его использовать в данной ситуации.

  Ответить  
 
 автор: dimaxz   (21.01.2011 в 10:24)   письмо автору
 
   для: Spenser   (21.01.2011 в 10:22)
 

попробуй продукт dbForge for Mysql позволяющий графически строить запросы если так не можешь

  Ответить  
 
 автор: Косорылый   (21.01.2011 в 10:27)   письмо автору
 
   для: Spenser   (21.01.2011 в 10:22)
 

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

  Ответить  
 
 автор: cheops   (21.01.2011 в 10:40)   письмо автору
 
   для: Spenser   (21.01.2011 в 10:22)
 

Можно поступить следующим образом
SELECT COUNT(categories.seoname)
FROM categories LEFT.JOIN goods USING(seoname)
WHERE categories.seoname='vodonagrevateli'

  Ответить  
 
 автор: Spenser   (21.01.2011 в 10:46)   письмо автору
 
   для: cheops   (21.01.2011 в 10:40)
 

А этот запрос будет считать колво записей только в таблице categories или во всех которые я перечислю: categories LEFT.JOIN goods LEFT.JOIN pages и т.д.?

  Ответить  
 
 автор: Trianon   (21.01.2011 в 10:48)   письмо автору
 
   для: Spenser   (21.01.2011 в 10:46)
 

ни в том, ни в другом.
Он будет считать количество строк табличного соединения, в которых это поле не является NULL.

Задачу Вы описать не смогли, поскольку в качестве описания привели пример с запросом декартового произведения, которое, я уверен, как работает не знаете, и что выдает - не проверяли.

  Ответить  
 
 автор: cheops   (21.01.2011 в 10:49)   письмо автору
 
   для: Spenser   (21.01.2011 в 10:46)
 

Вообще-то объединение - это декартово произведение, тут будет считаться только совпадающие записи. У меня подозрение, что вам вообще нужен UNION, т.е. что-то
SELECT COUNT(*) FROM categories
WHERE seoname='vodonagrevateli'
UNION
SELECT COUNT(*) FROM goods
WHERE seoname='vodonagrevateli'

в результате вы получите результирующу таблицу со столбцов цифр, сумма их даст количество всех записей во всех таблицах, удовлетворяющих условию WHERE seoname='vodonagrevateli'. Возможно вам это нужно?

  Ответить  
 
 автор: Trianon   (21.01.2011 в 10:51)   письмо автору
 
   для: cheops   (21.01.2011 в 10:49)
 

Вообще-то декартово произведение вариант соединения.
А объединение вовсе даже - UNION

  Ответить  
 
 автор: Spenser   (21.01.2011 в 11:04)   письмо автору
 
   для: cheops   (21.01.2011 в 10:49)
 

Да, этот запрос как раз то что нужно. в него я могу добавлять сколько угодно (10-20 таблиц) или тогда он будет выполняться долго?
и еще, если я сделаю так:

$sql = mysql_query(запрос);
$fetch = mysql_fetch_row($sql);
print_r($fetch);


соответственно выдаст уже количество записей в объединенных таблицах?

  Ответить  
 
 автор: Trianon   (21.01.2011 в 11:06)   письмо автору
 
   для: Spenser   (21.01.2011 в 11:04)
 

запрос cheops'а выдаст несколько строк (по числу таблиц).
Вы же выбираете только одну.

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

  Ответить  
 
 автор: Spenser   (21.01.2011 в 11:20)   письмо автору
 
   для: Trianon   (21.01.2011 в 11:06)
 

я понял как мне получить количество записей.

вообще после запроса мне нужно получить только колво записей в таблица соответствующие условию. по запросу cheops'a все работает . или его можно как то упростить?

  Ответить  
 
 автор: Trianon   (21.01.2011 в 11:24)   письмо автору
 
   для: Spenser   (21.01.2011 в 11:20)
 

Выдать несколько независимых запросов
SELECT COUNT(*) FROM categories WHERE seoname='vodonagrevateli'

SELECT COUNT(*) FROM goods WHERE seoname='vodonagrevateli'

и т.д.

  Ответить  
 
 автор: Spenser   (21.01.2011 в 11:43)   письмо автору
 
   для: Trianon   (21.01.2011 в 11:24)
 

я так делал до этого. но начитавшись про оптимизацию запросов к БД я подумал объединить их в один запрос. думаете в данном случае это не целесообразно (объединение запросов) для увеличения скорости обработки запросов (один сложный запрос ведь выполниться быстрее чем несколько мелких)? просто кол-во таблиц может быть большим (относительно конечно большим) порядка 20-ти.

  Ответить  
 
 автор: Trianon   (21.01.2011 в 11:51)   письмо автору
 
   для: Spenser   (21.01.2011 в 11:43)
 

>(один сложный запрос ведь выполниться быстрее чем несколько мелких)?
Откуда такой вывод? Совершенно в этом не убежден. Скорее наоборот.

Если у Вас порядка 20 таблиц с одним и тем же полем, и к ним в качестве основных следуют одинаковые запросы, это повод пересмотреть всю схему БД (а может быть и модель данных).
Похоже, что она проектировалась не под те задачи, которые на ней пытаются решать.

Если это запросы неосновные, и погоды в производительности всего приложения не делают, Вы зря взялись за оптимизацию этого участка.

  Ответить  
 
 автор: Spenser   (21.01.2011 в 12:17)   письмо автору
 
   для: Trianon   (21.01.2011 в 11:51)
 

Спасибо за информацию к размышлению!:) попробую посчитать по времени выполнения запрос что в моем случае предпочтительнее.

  Ответить  
 
 автор: Spenser   (21.01.2011 в 11:20)   письмо автору
 
   для: cheops   (21.01.2011 в 10:49)
 

Спасибо за помощь, теперь получаю нужные данные:)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования