2014-07-02 3 views
0

В запросеMysql подзапрос несколько результатов

SELECT artists.artist_id, images.img_id 
FROM `artists`, `images` 
WHERE artists.artist_id = :artist_id 
AND images.artist_id = :artist_id 

возвращает следующий, например:

Array 
(
[0] => Array 
    (
     [artist_id] => 80 
     [img_id] => 4 
    ) 

[1] => Array 
    (
     [artist_id] => 80 
     [img_id] => 5 
    ) 

[2] => Array 
    (
     [artist_id] => 80 
     [img_id] => 6 
    ) 

[3] => Array 
    (
     [artist_id] => 80 
     [img_id] => 140 
    ) 

) 

Как сделать так, чтобы он возвращал artist_id только раз и изображения идентификаторов в отдельный массив? Я тоже пробовал INNER JOIN images ON images.artist_id = :artist_id, но возвращает что-то подобное.

+1

это можно сделать лучше в стороне PHP, обернув по результатам и создание нового массива для изображений, mysql - это не язык программирования. –

+0

База данных, как правило, прямоугольная. Если вам нужно что-то другое, вам нужно сделать это самостоятельно. Обратите внимание, что часто нетрудно обрабатывать данные в формате, который у вас есть сейчас просто '. используя' ORDER BY artist_id' и 2. Вспоминая последний 'artist_id' и проводя сравнение с текущим' artist_id', чтобы узнать, вы меняете художников. –

+1

@MKhalidJunaid это должно быть сделано в php. он не будет следовать правилам нормализации для создания структуры базы данных, такой как OP, просит о возврате данных таким образом. простой цикл в php должен работать. вот почему я поднял голову :) –

ответ

0

Попробуйте сделать это на вашей стороне php. было бы намного проще

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я написал php, возможно, дважды .. поэтому я никоим образом не специалист по php .. но это то, что я постараюсь сделать. любой пользователь может исправить код, если он неисправен;)

НАСТРОЙКА: Я создал массив массивов, как и у вас. сделал пустой массив называется image_ids толкнул img_id на этом массиве, чтобы получить только массив из img_id «ы

$test = Array 
(
Array 
    (
     artist_id => 80, 
     img_id => 4 
    ), 

Array 
    (
     artist_id => 80, 
     img_id => 5 
    ), 

Array 
    (
     artist_id => 80, 
     img_id => 6 
    ), 

Array 
    (
     artist_id => 80, 
     img_id => 140 
    ) 

); 

ПОСЛЕ УСТАНОВКИ - ЭТО КОДИРОВАНИЕ ВРЕМЯ !:

$image_ids = Array(); 
$artist = 0; 
foreach ($test as $my_array){ // $test is the variable the whole array is equal to 
    array_push($image_ids, $my_array['img_id']); 
} 
$artist = $my_array['artist_id']; // my_artist is the last element in the array currently 

echo 'the artist is: ', $artist; 
echo 'the images he made are :'; 
print_r ($image_ids); 
0

One вариант состоит в том, чтобы запускать два отдельных запроса:

SELECT artists.artist_id 
    FROM `artists` 
WHERE artists.artist_id = :artist_id 

SELECT images.img_id 
    FROM `images` 
WHERE images.artist_id = :artist_id 

Если типы данных этих двух столбцов эквивалентны nt (т.е. и являются целыми числами), мы могли бы объединить два запроса (с использованием UNION ALL набора оператор А to return a single list of id values. We could add a discriminator column to the result set, to identify which rows are from the художников table, and which are from the images` стол

Например:.

SELECT 'artist_id'   AS src 
    , artists.artist_id AS id 
    FROM `artists` 
WHERE artists.artist_id = :artist_id 
UNION ALL 
SELECT 'img_id'   AS src 
    FROM images.img_id 
    FROM `images` 
WHERE images.artist_id = :artist_id 
Смежные вопросы