PHP / الخلية - كيفية جلب صفوف متداخلة إلى مجموعة متعددة الأبعاد

StackOverflow https://stackoverflow.com/questions/357122

سؤال

وقادمة من <لأ href = "https://stackoverflow.com/questions/356778/php-query-single-value-per-iteration-or-fetch-all-at-start-and-retrieve-from- ع "> سؤال آخر من الألغام حيث تعلمت عدم استخدام EVER الاستفسارات ديسيبل داخل حلقات I بالتالي قد لمعرفة كيفية جلب جميع البيانات بطريقة سهلة قبل أن حلقة من خلال ذلك.

ودعونا نقول لدي 'موازين' اثنين من الجداول وسلع. كل عنصر في المخزن عناصر تنتمي إلى نطاق واحد في جداول ويرتبط مع مفتاح خارجي (scaleID). أريد أن جلب كل تلك البيانات إلى بنية مجموعة في استعلام واحد من هذا القبيل أن البعد الأول هي كل المقاييس مع كافة الأعمدة ومتداخلة داخل، وجميع البنود على نطاق واحد فقط الأعمدة.

وسوف تكون النتيجة شيء من هذا القبيل:

scale 1, scaleParam1, scaleParam2, ...
....item1, itemParam1, itemParam2, ...
....item2, itemParam1, itemParam2, ...
scale 2, scaleParam2, scaleParam2, ...
....item1, itemParam1, itemParam2, ...
....item2, itemParam1, itemParam2, ...

وحتى الآن أنا قد فعلت أساسا اليسار ينضم لعلاقات واحد الى واحد. هذا هو واحد لكثير وأنا فقط لا يمكن لف رأيي حوله.

هل من حق الانضمام، ويمكن أيضا أن يتم ذلك مع استعلام فرعي، وكيفية الحصول الصفوف الخارجية الكاملة في أنها كذلك ...

وبعد أود أن تكرار من خلال ذلك مع لحلقات foreach المتداخلة.

وربما انها مجرد أن لدي صداع ...

هل كانت مفيدة؟

المحلول

والاستعلام ينبغي أن ننظر بشيء من هذا القبيل:

SELECT * FROM scales
INNER JOIN items ON scales.id = items.scale_id

إذا كنت تريد تكرار خلال مع حلقات متداخلة، ستحتاج إلى سحب هذه البيانات في صفيف - نأمل ان كنت لا يتراجع كثيرا أنه سوف تلتهم الكثير من الذاكرة

$scales = array();

while ($row = mysql_fetch_assoc($data))
{
    if (!isset($scales[$row['scale_id']]))
    {
        $row['items'] = array();
        $scales[$row['scale_id']] = $row;
    }

    $scales[$row['scale_id']]['items'][] = $row;
}

وبعد ذلك يمكنك حلقة من خلال:

foreach ($scales as $scale)
{
    foreach ($scale['items'] as $item)
        ; //... do stuff
}

ملحوظة: هذا من السذاجة إلى حد ما في هذا النطاق $ و $ البند سوف كلا تحتوي على حقول من كلا الجدولين ... إذا كان هذا هو مشكلة فأنت بحاجة إلى تغيير تعيينات في حلقة فوق لسحب فقط الحقول التي تريدها.

نصائح أخرى

قد يكون من الأسهل أولا الحصول على كل المقاييس، وبعد ذلك كل البنود.

//first get scales
while ($row = fetchrowfunctionhere()) {
    $scale = $scales->createFromArray($row);
}

//then get items
$lastId = null;
while ($row = fetchrowfunctionhere()) {
    $scaleId = $row['scaleID'];
    if ($lastId != $scaleId) {
        $scale = $scales->getByScaleId($scaleId);
    }
    $item = $items->createFromArray($row);
    $scale->addItem($item);
    $lastId = $scaleId;
}

وأو كل شيء في مزود واحد

$lastId = null;
while ($row = fetchrowfunctionhere()) {
    $scaleData = array_slice($row, 0, 5, true);
    $itemData = array_slice($row, 5, 5, true);
    $scaleId = $scaleData['scaleID'];
    if ($lastId != $scaleId) {
        $scale = $scales->createFromArray($scaleData);
    }
    $item = $items->createFromArray($itemData);
    $scale->addItem($item);
    $lastId = $scaleId;
}

وكل شيء كما مجموعة واحدة سعيدة

while ($row = fetchrowfunctionhere()) {
    $scaleData = array_slice($row, 0, 5, true);
    $itemData = array_slice($row, 5, 5, true);
    $scaleId = $scaleData['scaleID'];
    if (!isset($scales[$scaleId])) {
        $scales[$scaleId] = $scaleData;
    }
    $itemId = $itemData['itemID'];
    $scales[$scaleId]['items'][$itemId] = $itemData;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top