Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Двух зайцев одним запросом MySQL

396
28 сентября 2010 года
SibBear
223 / / 27.07.2006
Продолжаем изучение мускуля...

Есть таблица с авторами

id | avtor
1 вася
2 даша
...
N петя

и таблица со статьями

id | avtor | name
1 1 про машины
2 1 про велосипеды
3 2 рецепт бухлаваш
и т.п.

вопрос

как одним запросом выбрать всех авторов и количества статей ими написанное, чтобы не создавать запрос в цикле ?

у меня думки не хватает...

 
Код:
$q = mysql_query("SELECT id, avtor FROM avtors WHERE 1") or die (mysql_error());

    while ($row = mysql_fetch_row($q))
    {
               $q_c = mysql_query("SELECT count(*) FROM statyi WHERE avtor=".$row[1]) or die (mysql_error());
    }


вот эта конструкция меня право напрягает...
274
28 сентября 2010 года
Lone Wolf
1.3K / / 26.11.2006
 
Код:
SELECT u.avtor, count(c.id) as cnt FROM authors u left join articles c on c.avtor=u.id group by c.avtor order by cnt DESC
396
28 сентября 2010 года
SibBear
223 / / 27.07.2006
Ой спасибо! Красота какая! Я штук 30 комбинаций передумал...
Только что еще вариант нарыл
 
Код:
select *, (Select count(*) from statyi WHERE statyi.avtor=avtor.id) From avtors)

но это тот же запрос в запросе...
А у вас красиво получилось!
Спасибо еще раз!
52K
28 сентября 2010 года
lexandr
26 / / 16.07.2010
Извините что в тему лезу ) Подскажите где про join можно почитать, только как можно попроще.
369
28 сентября 2010 года
Kesano
451 / / 09.10.2007
Цитата: lexandr
Извините что в тему лезу ) Подскажите где про join можно почитать, только как можно попроще.



http://www.mysql.ru/docs/mysql-man-4.0-ru/reference.html#join
вродь здесь не очень сложно...

2
28 сентября 2010 года
squirL
5.6K / / 13.08.2003
Цитата: lexandr
Извините что в тему лезу ) Подскажите где про join можно почитать, только как можно попроще.



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

вот полезная ссылочка еще :)

396
29 сентября 2010 года
SibBear
223 / / 27.07.2006
я начинал тут
http://www.anton-pribora.ru/articles/mysql/mysql-join
396
29 сентября 2010 года
SibBear
223 / / 27.07.2006
А вот теперь задача сложнее...
есть характеристики книг, и таблица с названиями этих характеристик

directory_names

id | name
8 строки из книг

directory
id | name | value
1 | 8 | верхняя строка
2 | 8 | средняя строка
3 | 8 | нижняя строка

результат объединения

name | directID | value
8 | 1 | верхняя строка
8 | 2 | средняя строка
8 | 3 | нижняя строка

но есть еще одна таблица в которой значения этих строк

id | parent | p_type | directID | value
8 | 1 | | книга | 1 (верхняя строка) | Жили были
8 | 1 | | книга | 2 (средняя строка) | ...


где
parent = id книги
p_type = тип книги, книга, справочник или еще что...


так вот.
Нужно собрать эти таблицы так, чтобы он вывел все 3 строки из directory, тоесть список возможных характеристик (у нас 3) и к каждой характеристике подставил значение value при условии что это книга, или Null если это справочник. Тоесть если для книги значение какой то строки (жили были) задано, то выводим, если нет, то пишем Null.

должно получиться чтото вроде

id | d.value | b.value
1 | верхняя строка | Жили были
2 | средняя строка | дед да баба
3 | нижняя строка | null

для книги

и

id | d.value | b.value
1 | верхняя строка | null
2 | средняя строка | null
3 | нижняя строка | null

для справочника.

есть предложения?
у меня пока выводит только то, где есть значения, тоесть 2 строки из трех, или 0, а надо 3...
274
29 сентября 2010 года
Lone Wolf
1.3K / / 26.11.2006
что-то не догнал я струкуры..
есть список книг(id, Название), список характеристик(id, ????, название_характеристики), значение характерисики (id, Id-book,?????, id_характеристик, значение)

знаками вопроса отмечены не понятные поля,
396
29 сентября 2010 года
SibBear
223 / / 27.07.2006
книг(id, Название), список характеристик(id, название_характеристики), значение характерисики (id, Id-book, вид книги (худ справочник рецепт), id_характеристик, значение)
вот так лучше будет

сейчас мне приходится пробегать по всем характеристикам, а потом в цикле делать запрос и выбирать значения если они существуют. Около 10 характеристик, соотсетственно 10 запросов на каждую книгу...
274
29 сентября 2010 года
Lone Wolf
1.3K / / 26.11.2006
1. а что вид книги, делает в списке характеристик? его в таблицу книг перенсти надо
2. Что нужно вытянуть значение всех характеритики для книг типа "худ_книга"?

 
Код:
SELECT cv.value,c.name,b.title FROM chars_calues cv LEFT JOIN chars c on c.d=cv.id_char LEFT JOIN books b on b.id=cv.id_book WHERE cv.book_type="нужный тип"
396
29 сентября 2010 года
SibBear
223 / / 27.07.2006
1. потому что характеристика идет к типу книги и к самой книге, там связка 2х ключей, ее не получится убрать,
допустим средняя строка из "книга" id=3, "книги"
средняя строка из "брошюра" id=3, "брошюры"

2. нужно собрать список всех характеристик которые есть (у нас их 3), вывести все и дополнить столбцом "значение характеристики" для конкретной книги конкретного вида

для "книга" из "книги"
верх строк | значение
сред. строк. | значение
нижн.строк | null

для "брошюра" из "брошюры"

верх строк | null
сред. строк. | null
нижн.строк | null

а в данном запросе он выведет только 2 строки, т.к. 3я характеристика для данной книги отсутствует в таблице, а нужно чтобы он вывел 3 строки, в последней поставив null в значении характеристики
Короче как только я вставляю WHERE все NULL вылетают из таблицы,

тут похоже никак не обойти, таблицу поменять не получится, а выбрать так как мне нужно без цикличного запроса не получится...
274
29 сентября 2010 года
Lone Wolf
1.3K / / 26.11.2006
1. Пожожди, у тебя получается есть книга типа "худ.литература" у нее 3 хар-ки соовтественно в табл значений будет 3 записи книга_ хар_ знач_ и у всех трех записей одно и тоже значение типа книги? или я не так поня предназначение этого поля?
Я бы его вынес в таблицу книг....

2.
 
Код:
SELECT cv.value,c.name,b.title FROM  chars c LEFT JOIN chars_calues cv on c.d=cv.id_char LEFT JOIN books b on b.id=cv.id_book WHERE cv.book_type="нужный тип"


3. Вылитает не изза where,а потому что выборка шла из таблицы значений, елси сделать как щас, то должно быть то что надо..
Хотя мне так труднова-то. если не сложно дампани свои таблицы если, конечно это не живая база и там нету ничего секретного и скинь мне.
так будет проще работспособность проверить.
396
29 сентября 2010 года
SibBear
223 / / 27.07.2006
Уря! я помоему нашел
я забыл что AND можно не только после WHERE использовать но и в ON
щас поковыряю, если все ок то супер...
274
29 сентября 2010 года
Lone Wolf
1.3K / / 26.11.2006
та все пролазит.
главное правильно цепочку джоинов выстроить
396
29 сентября 2010 года
SibBear
223 / / 27.07.2006
ct = "типы характеристик";
cv = "значения характеристик";
t = "тип (книга)"
t_id = "номер книги (id)"

 
Код:
SELECT * FROM ct LEFT JOIN cv ON ct.type_id = cv.id AND cv.parent_id=t_id AND cv.parent_type=t


в результате он выдал 3 строки, и если значение какойто характеристики для данной книги (t_id) отсутствует, то он пишет null
ура!

по аналогии уже сделал выборку из 3х таблиц по 3м ключам, ой какая прелесть эти JOINы, удобно до безобразия когда понятно как :)
64K
06 октября 2010 года
Lenusiks
1 / / 03.10.2010
Ekho помоги пожалуста еще
imagesperpage = 2; // картинок на страницу

page = isset_GETname ? _GETname : 0 ;
if ctype_digitpage page = 0;
offset = page imagesperpage;
result = mysql_query"SELECT FROM zerkalo_vlag limit imagesperpage, offset";
это не работает я не понимаю почему помоги а?
244
06 октября 2010 года
UAS
2.0K / / 19.07.2006
Потому что код, мягко говоря, написан не по правилам языка, жестко говоря - через ж*пу. Идите учебник читайте.
274
06 октября 2010 года
Lone Wolf
1.3K / / 26.11.2006
что за ахинея? куда делись все скобки, знаки долара и звездочки?
Код нормальный напиши...
396
07 октября 2010 года
SibBear
223 / / 27.07.2006
да этож qbasic, че вы привязались к парню :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог