$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());
}
Двух зайцев одним запросом MySQL
Есть таблица с авторами
id | avtor
1 вася
2 даша
...
N петя
и таблица со статьями
id | avtor | name
1 1 про машины
2 1 про велосипеды
3 2 рецепт бухлаваш
и т.п.
вопрос
как одним запросом выбрать всех авторов и количества статей ими написанное, чтобы не создавать запрос в цикле ?
у меня думки не хватает...
Код:
вот эта конструкция меня право напрягает...
Код:
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
Только что еще вариант нарыл
Код:
select *, (Select count(*) from statyi WHERE statyi.avtor=avtor.id) From avtors)
но это тот же запрос в запросе...
А у вас красиво получилось!
Спасибо еще раз!
Извините что в тему лезу ) Подскажите где про join можно почитать, только как можно попроще.
Цитата: lexandr
Извините что в тему лезу ) Подскажите где про join можно почитать, только как можно попроще.
http://www.mysql.ru/docs/mysql-man-4.0-ru/reference.html#join
вродь здесь не очень сложно...
Цитата: lexandr
Извините что в тему лезу ) Подскажите где про join можно почитать, только как можно попроще.
http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
вот полезная ссылочка еще :)
есть характеристики книг, и таблица с названиями этих характеристик
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...
есть список книг(id, Название), список характеристик(id, ????, название_характеристики), значение характерисики (id, Id-book,?????, id_характеристик, значение)
знаками вопроса отмечены не понятные поля,
вот так лучше будет
сейчас мне приходится пробегать по всем характеристикам, а потом в цикле делать запрос и выбирать значения если они существуют. Около 10 характеристик, соотсетственно 10 запросов на каждую книгу...
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="нужный тип"
допустим средняя строка из "книга" id=3, "книги"
средняя строка из "брошюра" id=3, "брошюры"
2. нужно собрать список всех характеристик которые есть (у нас их 3), вывести все и дополнить столбцом "значение характеристики" для конкретной книги конкретного вида
для "книга" из "книги"
верх строк | значение
сред. строк. | значение
нижн.строк | null
для "брошюра" из "брошюры"
верх строк | null
сред. строк. | null
нижн.строк | null
а в данном запросе он выведет только 2 строки, т.к. 3я характеристика для данной книги отсутствует в таблице, а нужно чтобы он вывел 3 строки, в последней поставив null в значении характеристики
Короче как только я вставляю WHERE все NULL вылетают из таблицы,
тут похоже никак не обойти, таблицу поменять не получится, а выбрать так как мне нужно без цикличного запроса не получится...
Я бы его вынес в таблицу книг....
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,а потому что выборка шла из таблицы значений, елси сделать как щас, то должно быть то что надо..
Хотя мне так труднова-то. если не сложно дампани свои таблицы если, конечно это не живая база и там нету ничего секретного и скинь мне.
так будет проще работспособность проверить.
я забыл что AND можно не только после WHERE использовать но и в ON
щас поковыряю, если все ок то супер...
главное правильно цепочку джоинов выстроить
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ы, удобно до безобразия когда понятно как :)
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";
это не работает я не понимаю почему помоги а?
Потому что код, мягко говоря, написан не по правилам языка, жестко говоря - через ж*пу. Идите учебник читайте.
Код нормальный напиши...
да этож qbasic, че вы привязались к парню :)